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:
Załącznik 377
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
Następnie uruchamiamy OpenSSL poleceniem:Kod:C:\Users\Karol>cd ssl
C:\Users\Karol\ssl>
Widzimy, że OpenSSL zgłosiło się nam znakiem zachęty "OpenSLL>"Kod:C:\Users\Karol\ssl>openssl
OpenSSL>
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:
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)Kod:genrsa -des3 -out ca/ca.key 4096
(Nie przejmuj się, że nic się nie pojawia. Klucz jest odczytywany bez wyświetlania "*")
Widzimy, że wszystko zostało ukończone pomyślnie.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>
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).
Nie będę tłumaczył ponownie tego kroku.Kod:genrsa -des3 -out key.key 4096
***[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.
Podajemy hasło i wciskamy ENTERKod:rsa -in key.key -out key.key
***[Koniec kroku opcjonalnego]***
Następnie tworzymy CSR (Certificate Signing Request) czyli plik żądania certyfikatu.
Kod:req -new -key key.key -out cerreq.csr
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)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>
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).
Oczywiście możemy zedytować "-days 365" na liczbę dni na jaką chcemy wystawić certyfikat(ja wystawię na 10 dni)Kod:ca -policy policy_anything -cert ca/ca.cer -in cerreq.csr -keyfile ca/ca.key -days 365 -out cer.cer
Na początku podajemy hasło klucza prywatnego ROOT-a, ENTER, y, ENTER, y, ENTER.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>
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.Kod:127.0.0.1 DOMENA
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:
Do katalogu(o ile nie zmieniliśmy ścieżki przy instalacji): C:\wamp\bin\Apache\Apache[Wersja]\confKod: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>
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:
Załącznik 379
Gotowe!
To mój pierwszy tutorial, czekam na Wasze komentarze!