Witam wszystkich użytkowników.
Szukając ciekawych artykułów na temat podpisywania własnych certyfikatów SSL spędziłem ponad 3 godziny. Mało jest tekstów na ten temat, a jeśli już to są w nich liczne błędy uniemożliwiające poprawne wystawienie sobie self-signed(własnoręcznie podpisanego) certyfikatu SSL. Kiedy już udało mi się wszystko "ogarnąć" postanowiłem, że podzielę się swoim doświadczeniem w tym zakresie.
1. Co to jest i do czego służy certyfikat
Certyfikaty służą do potwierdzenia swojej tożsamości.
Są one głównie używanie do bezpiecznych połączeń między serwerem www a klientem, poza zabezpieczonym połączeniem certyfikat potwierdza także, że właściciel domeny(serwera z którym się połączyliśmy) został sprawdzony przez centrum certyfikacji.
Przykład certyfikatu:
Screen1.JPG
Widzimy tu stronę google.pl. Koło adresu pojawia się zielona kłódka potwierdzająca szyfrowane, bezpieczne połączenie.
2. Przygotowanie OpenSSL
Certyfikat Root pozwoli nam na podpisywanie kolejnych certyfikatów, które wydamy.
Po pierwsze: ściągamy OpenSSL, a następnie instalujemy.
Tworzymy dowolny katalog w którym będą przechowywane nasze certyfikaty(dla mnie będzie to: C:\Users\Karol\ssl
Otwieramy wiersz polecenia(Start->cmd.exe->ENTER)
Nawigujemy do naszego nowo utworzonego katalogu poleceniem CD
Kod:
C:\Users\Karol>cd ssl
C:\Users\Karol\ssl>
Następnie uruchamiamy OpenSSL poleceniem:
Kod:
C:\Users\Karol\ssl>openssl
OpenSSL>
Widzimy, że OpenSSL zgłosiło się nam znakiem zachęty "OpenSLL>"
Jesteśmy już gotowi do przeprowadzenia wszystkich potrzebnych operacji.
3. Stworzenie własnego CA Root(Certification Authority Root Certificate)
Utwórzmy katalog ca\ wewnątrz naszego katalogu z certyfikatami(dla mnie jest to: C:\Users\Karol\ssl\ca)
Musimy zacząć od utworzenia klucza prywatnego
Utworzymy teraz klucz RSA o długości 4096-bitów poleceniem:
Kod:
genrsa -des3 -out ca/ca.key 4096
Zostaniemy poproszeni o powtórne wpisanie hasła(ważne aby go zapamiętać, nie ma opcji "Zapomniałem hasła", w przeciwnym wypadku musimy zacząć od nowa)
(Nie przejmuj się, że nic się nie pojawia. Klucz jest odczytywany bez wyświetlania "*")
Kod:
OpenSSL> genrsa -des3 -out ca/ca.key 4096
Loading 'screen' into random state - done
Generating RSA private key, 4096 bit long modulus
..
[...]
..
e is 65537 (0x10001)
Enter pass phrase for ca/ca.key:
Verifying - Enter pass phrase for ca/ca.key:
OpenSSL>
Widzimy, że wszystko zostało ukończone pomyślnie.
Teraz utworzymy nasz certyfikat w oparciu o klucz prywatny CA wydając polecenie:
Kod:
req -new -x509 -days 3650 -key ca/ca.key -out ca/ca.cer
Kod:
OpenSSL> req -new -x509 -days 3650 -key ca/ca.key -out ca/ca.cer
Enter pass phrase for ca/ca.key: MUSIMY PODAĆ NASZE HASŁO
[...]
Country Name (2 letter code) [AU]:PL
State or Province Name (full name) [Some-State]:Wojewodztwo
Locality Name (eg, city) []:Miasto
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Firma
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:Disa's Root Certificate
Email Address []:dis [at] mail [dot] rotf.pl
OpenSSL>
Tak jak wyżej podane, zostaniemy poproszeni o podanie kolejno:
- Hasła prywatnego CA
- Kod państwa
- Województwa
- Miasta
- Naszej organizacji
- Typ organizacji
- Nazwę naszego certyfikatu ROOT CA
- Adresu e-mail(podajemy go w postaci: user@domena, w powyższym kodzie specjalnie zamieniłem @ na [at] i . na [dot], aby uniknąć SPAM-u)
- **Czasem zostaniemy poproszeni o dodatkowe dane, które pomijamy wciskając dwukrotnie ENTER
Nasz certyfikat został utworzony, możemy dodać go teraz do naszego magazynu certyfikatów systemu.
Otwieramy naszą lokalizację: \ssl\ca i dwukrotnie klikamy na: ca.cer, następnie w nowo otwartym oknie przycisk: "Zainstaluj Certyfikat..."
W kreatorze: Dalej, "Umieść [...] w następującym magazynie", "Przeglądaj", "Zaufane główne urzędy certyfikacji", "Ok", "Dalej", "Zakończ".
Teraz ponowne otworzenie certyfikatu pokaże, że jest on zaufany.
4. Stworzenie certyfikatu SSL dla serwera WWW
Ponownie tworzymy klucz prywatny(nie ten sam co dla certyfikatu CA ROOT).
Kod:
genrsa -des3 -out key.key 4096
Nie będę tłumaczył ponownie tego kroku.
***[Ten krok jest opcjonalny, aczkolwiek polecam wykonanie go]***
Usuniemy teraz hasło z naszego klucza prywatnego, jeśli tego nie zrobimy, przy każdym użyciu naszego certyfikatu będziemy zobowiązani podać nasze hasło. Wszystko było by dobrze, gdyby nie to, że przy każdym uruchomieniu naszego serwera WWW, musimy podać to hasło. Serwer może czasem się zrestartować i ssl nie będzie działał dopóki nie wpiszemy tego hasła.
Kod:
rsa -in key.key -out key.key
Podajemy hasło i wciskamy ENTER
***[Koniec kroku opcjonalnego]***
Następnie tworzymy CSR (Certificate Signing Request) czyli plik żądania certyfikatu.
Kod:
req -new -key key.key -out cerreq.csr
Kod:
OpenSSL> req -new -key key.key -out cerreq.csr
[...]
Country Name (2 letter code) [AU]:PL
State or Province Name (full name) [Some-State]:Wojewodztwo
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Ogarnizacja
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:*.dekiel.disa
Email Address []:dis at mail . rotf.pl
[...]
A challenge password []:
An optional company name []:
OpenSSL>
Podobnie jak w przypadku wystawiania certyfikatu ROOT CA, jednak w tym przypadku "Common Name" musi być nazwą naszej domeny(dodanie na początku *. spowoduje, że zostanie utworzony tzw. wildcard, czyli certyfikat, który możemy używać na wszystkich naszych subdomenach np. www.mojadomena oraz mail.mojadomena) w moim przypadku jest to *.dekiel.disa(domena: dekiel.disa + wildcard dzięki któremu będę mógł używać subdomen z ssl)
Kolejny krok to podpisane CSR naszym certyfikatem Root-a.
Najpierw musimy utworzyć katalog: demoCA w ssl\, newcerts w ssl\demoCA\ oraz pliki(w demoCA\): index.txt(pusty), serial(zawartość: dowolna liczba w zapisie szestnastkowym)(bez rozszerzenia).
Kod:
ca -policy policy_anything -cert ca/ca.cer -in cerreq.csr -keyfile ca/ca.key -days 365 -out cer.cer
Oczywiście możemy zedytować "-days 365" na liczbę dni na jaką chcemy wystawić certyfikat(ja wystawię na 10 dni)
Kod:
OpenSSL> ca -policy policy_anything -cert ca/ca.cer -in cerreq.csr -keyfile ca/c
a.key -days 10 -out cer.cer
Using configuration from C:\OpenSSL\bin\openssl.cfg
Loading 'screen' into random state - done
Enter pass phrase for ca/ca.key:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 293 (0x125)
Validity
Not Before: Dec 15 13:36:48 2012 GMT
Not After : Dec 25 13:36:48 2012 GMT
Subject:
countryName = PL
stateOrProvinceName = Wojewodztwo
organizationName = Ogarnizacja
commonName = *.dekiel.disa
emailAddress = dis at mail . rotf.pl
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
E9:5E:39:52:A8:AC:03:69:A7:B8:0B:6B:92:E8:E1:D6:6C:E5:DF:60
X509v3 Authority Key Identifier:
keyid:66:F1:B3:9D:1E:8F:96:B3:EC:4F:0D:F9:7E:F7:0B:0B:5A:44:64:5
1
Certificate is to be certified until Dec 25 13:36:48 2012 GMT (10 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
OpenSSL>
Na początku podajemy hasło klucza prywatnego ROOT-a, ENTER, y, ENTER, y, ENTER.
Nasz certyfikat jest już podpisany.
5. Implementacja certyfikatu SSL na naszym serwerze www.
W moim przypadku będę wykonywał operacje na moim localhoscie.
Najpierw dodam wpisy do Hosts, aby www.dekiel.disa przekierować na 127.0.0.1 czyli mój komputer.
C:\Windows\System32\drivers\etc\hosts
Dodajemy na końcu:
Zapisujemy plik.
Jeśli nie mamy jeszcze serwera www na naszym komputerze polecam użycie WAMPServer.
Po zainstalowaniu klikamy na ikonkę W koło zegara systemowego, następnie: Apache, Apache Module, ssl_module.
Wamp się zrestartuje, następnie: Klik, Apache, httpd.conf
Otworzy nam się Notatnik, zjeżdżamy na sam dół i dopisujemy:
Kod:
NameVirtualHost *:443
<VirtualHost *:443>
SSLProtocol all -SSLv2
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
DocumentRoot "C:/wamp/www"
ErrorLog logs/ssl-error.log
TransferLog logs/ssl-access.log
SSLEngine On
SSLCertificateFile conf/cer.cer
SSLCertificateKeyFile conf/key.key
SSLCACertificateFile conf/ca.cer
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
SSLVerifyClient none
SSLProxyEngine off
</VirtualHost>
Do katalogu(o ile nie zmieniliśmy ścieżki przy instalacji): C:\wamp\bin\Apache\Apache[Wersja]\conf
Wrzucamy tu nasz klucz prywatny certyfikatu wystawionego dla domeny(Nie ROOT), certyfikat domeny oraz certyfikat Root.
Restartujemy serwer, wpisujemy domenę w adresie, którą wybraliśmy w HOSTS:
Screen2.JPG
Gotowe!
To mój pierwszy tutorial, czekam na Wasze komentarze!