Nasazení ECC a RSA současně
Chcete-li využít výhod SSL/TLS certifikátu s ECC klíčem, ale zároveň zajistit kompatibilitu se zastaralými systémy, které podporují pouze RSA klíče, můžete web server celkem jednoduše nastavit tak, aby klientovi posílal buď SSL/TLS certifikát s ECC klíčem nebo RSA klíčem podle toho, který klient podporuje.
Zní to složitě, ale řešení v tomto návodu je celkem triviální a implementace nezabere více jak pár minut.
Co potřebuji
- dva samostatné SSL/TLS certifikáty — jeden s ECC a druhý s RSA klíčem, oba pro stejnou doménu/domény
- Apache verze 2.4.8+ nebo nginx 1.11.0+
- OpenSSL 1.0.2 nebo novější
Aktuální verzi Apache zjistíte příkazem apache2 -version, aktuální verzi OpenSSL pak příkazem openssl version.
Konfigurace Apache
Pokud v konfiguraci VirtualHostu používáte pro intermediate CA certifikáty direktivu SSLCertificateChainFile, pak ji zakomentujte nebo smažte. Tu lze totiž definovat pouze jednou, ale SSL/TLS certifikáty s ECC a RSA klíči mají odlišné intermediate CA certifikáty. Pro instrukce, jak nastavit intermediate CA certifikáty čtěte dále.
Příklad původní konfigurace s jedním SSL/TLS certifikátem:
SSLCertificateFile /cesta/k/ssl.crt
SSLCertificateKeyFile /cesta/k/privatni.key
SSLCACertificateFile /cesta/k/intermediate_chain.crt
Elegance řešení spočívá jednoduše v tom, že direktivy SSLCertificateFile (serverový certifikát) a SSLCertificateKeyFile (privátní klíč) uvedeme v konfiguraci VirtualHostu dvakrát … jednou pro SSL/TLS certifikát s ECC klíčem a podruhé pro SSL/TLS certifikát s RSA klíčem.
Příklad konfigurace s ECC i RSA klíčem simultánně:
SSLCertificateFile /cesta/k/ssl-ecc.crt
SSLCertificateKeyFile /cesta/k/privatni-ecc.key
SSLCertificateFile /cesta/k/ssl-rsa.crt
SSLCertificateKeyFile /cesta/k/privatni-rsa.key
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
Pokud jste direktivu SSLCipherSuite ještě neměli nastavenou, tak ji nastavte — a to tak, aby měly přednost šifrovací algoritmy používající ECC a následně RSA.
Rovněž jste si jistě všimli, že direktivu SSLCACertificateFile jsme úplně odebrali. To proto, že jsou příslušné intermediate CA certifikáty umístěny přímo v souborech se serverovými SSL/TLS certifikáty ssl-ecc.crt a ssl-rsa.crt. Certifikáty jsou jeden pod druhým v tomto pořadí:
- serverový SSL/TLS certifikát (www.example.com) ⇩
- intermediate CA certifikát, kterým je podepsán certifikát výše ⇩
- případný další intermediate CA certifikát, kterým je podepsán intermediate CA certifikát výše ⇩
- nakonec můžete přiložit kořenový root CA certifikát, popř. cross-signed certifikát (tzv. intermediate root)
Příklad — obsah takového souboru SSL/TLS certifikátu s dvěma intermediate certifikáty a kořenovým certifikátem (celkem čtyři certifikáty) může vypadat například následovně:
-----BEGIN CERTIFICATE-----
QWxwaXJvU1NMIFJTQSBEViBDQTAeFw0yMTA1MjcwMDAwMDBaFw0yMjA2MjIyMzU5
NTlaMBgxFjAUBgNVBAMTDXd3dy5zc2wxMjMuZXUwggEiMA0GCSqGSIb3DQEBAQUA
A4IBDwAwggEKAoIBAQDhKBADSRiBM/1f7XNrZnWcdoql1Cmqifx3pRpogUtY6vWO
1lbQJ4D13r2w0UKYkLYjZJZ/W0hS9k1kpRC7aMLvSQ4PuF2hlq1nuuEd52+vLlmC
2Wyg3NPb5WT9q0mZsoxphL42f/xruIWQQVZo1PIp/e7WaxOOGguZUbg+iRtc0Zi/
hgXzrEdwQjo2hYUfFniVKnBfZ78k7GdPZldANTdYY8sKTZRBBUmDzoJo8j9giurJ
eRJN+nPTI1urV402e8g9PtbnmtsTt9KJVxbmIDvg87sVSUdVh8u1j9tFrDxb+rJs
6QXhhiN0JSgAu6NDMz0CGBG3efoz8JKPxIyaUhObAJESXfGrCImADt1K/o3dL3+z
66plQVQaj5yBP7xQV51HckX0FB/XAaMYJnXAYfRg8NOMyIUVeACwlvzTYK/3S+6/
YQHvfShDjYA5zbbb9291jWVJh6pQazs77yWoRW0cCc67g7daEbZxFSyhtKvIXPYf
ZsL2wy3HYEmRdKoQumEOc8Ti+eWJWzAtcw==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK
ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD
VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTIw
MTAwNjAwMDAwMFoXDTMwMTAwNTIzNTk1OVowQzELMAkGA1UEBhMCQ1oxFjAUBgNV
B66IjJqu/C6+S5SImDsoRH7+KVNy5RbTN6ewfq4QV6BbobFeT4qu9cJD68RENI7+
5GPDdKEtA4a9QJoArMYhrO8G/6sY8kBzJ2jjxdDjfDhdln2MuYxOjhQupm2Fx8gw
AlwJmEsZt1a8srqSbgjN0jxktv0+jCm31r6sXRGNLhF6ADnnkJyDr4ogDeTYZQLe
DNDNeO4vhlJw5jxOQA==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE
AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4
MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5
/czSAaF9ffgZGclCKxO/WIu6pKJmBHaIkU4MiRTOok3JMrO66BQavHHxW/BBC5gA
CiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWvu6rvP3t3O9LEApE9GQDTF1w52z97GA1F
zZOFli9d31kWTz9RvdVFGD/tSo7oBmF0Ixa1DVBzJ0RHfxBdiSprhTEUxOipakyA
vGp4z7h/jnZymQyd/teRCBaho1+V
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
-----END CERTIFICATE-----
Na závěr nezapomeňte Apache restartovat:
service apache2 restart
Konfigurace nginx
Nginx konfigurace funguje prakticky stejně jako u Apache. Hybridní konfigurace pro jednu doménu s dvěma SSL certifikáty může vypadat následovně:
ssl_certificate /cesta/k/ssl-ecc.crt
ssl_certificate_key /cesta/k/privatni-ecc.key
ssl_certificate /cesta/k/ssl-rsa.crt
ssl_certificate_key /cesta/k/privatni-rsa.key
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:DHE+AESGCM:DHE:!RSA!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!CAMELLIA:!SEED";
Tip na závěr
Pokud se při restartu Apache či nginx zobrazí chyba, přidejte na úplný konec souborů ssl-ecc.crt a ssl-rsa.crt jeden prázdný řádek.