В nginx настроить SSL для домена еще проще чем в Апаче. Для начала генерим закрытый ключ, запрос на сертификат и подписываем его как указано в статье настройка SSL на Apache
Теперь конфиг:
server {
listen 1.2.3.1:443;
keepalive_timeout 70;
server_name .domain.com;
ssl on;
ssl_protocols SSLv3 TLSv1;
ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
ssl_certificate /etc/nginx/vhosts/www.domain.crt;
ssl_certificate_key /etc/nginx/vhosts/www.domain.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 20m;
location ~* \.(JPG|jpg|jpeg|gif|png|ico|zip|doc|gz|rar|bz2|swf|avi|mpg|vmw|wmv|mpeg|mkv|js)$ {
root /usr/local/www/domain.com;
expires max;
}
location / {
proxy_pass http://127.0.0.1:80/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
Нюансы такие:
Файл с закрытым ключем придется делать без пароля. Если он у вас с паролем, то снять пароль можно так:
openssl rsa -in key.pem -out keyout.pem
Ну и если вы делаете нормальные подписанные авторитетными CA сертификаты уникальные для каждого домена, то не забыть вешать каждый домен на отдельный ип.
На апаче в такой конфигурации вообще ничего изменять не нужно и до апача доходит уже расшифрованный трафик.
nginx
nginx, ssl
Сертификаты бывают на один домен (будет работать только для mydomain.com или только для www.mydomain.com) и мультидоменные (*.mydomain.com). Мультидоменные стоят много дороже. В нашем случае рассматриваются сертификаты на один домен.
Генерим закрытый ключ и запрос на сертификат:
openssl genrsa –des3 –out mydomain.com.key 1024
openssl req -new -key mydomain.com.key -out mydomain.com.csr
Самое важное это указать Common name = mydomain.com. Остальные поля не так важны. Всякие Optional-поля лучше вообще не указывать.
На данном этапе если хотим подписать сертификат доверенным центром сертификации то отправляем им mydomain.com.csr. А если будем подписывать сами, то:
openssl x509 -req -days 365 -in mydomain.com.csr -signkey mydomain.com.key -out mydomain.com.crt
И базовый ssl.conf для примера:
SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect file:/dev/urandom 512
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
# If you use secret phrase
SSLPassPhraseDialog exec:/usr/local/etc/apache2/certs/domain.com.pass
SSLSessionCache dbm:/var/run/ssl_scache
SSLSessionCacheTimeout 300
SSLMutex file:/var/run/ssl_mutex
<VirtualHost 192.168.0.1:443>
<Directory /home/domain.com/htdocs>
Order Allow,Deny
Allow from all
</Directory>
DocumentRoot "/home/domain.com/htdocs"
ServerName domain.com:443
ServerAdmin you@example.com
ErrorLog /home/logs/httpsd-error.log
TransferLog /home/logs/httpsd-access.log
SSLEngine on
SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM
SSLCertificateFile /usr/local/etc/apache2/certs/domain.com.crt
SSLCertificateKeyFile /usr/local/etc/apache2/certs/domain.com.key
<FilesMatch "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/home/domain.com/htdocs">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog /home/logs/httpd-ssl_request.log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
Apache
apach, ssl
Генерим закрытый ключ и запрос на сертификат.
openssl genrsa –des3 –out mydomain.com.key 1024
openssl req -new -key mydomain.com.key -out mydomain.com.csr
Когда генерим CSR то не надо указывать e-mail, challenge password и дополнительные опции.
Если мы хотим подписать сертификат доверенным центром сертификации, то отправляем им mydomain.com.csr. Если же будем подписывать сами то:
openssl x509 -req -days 365 -in mydomain.com.csr -signkey mydomain.com.key -out mydomain.com.crt
И базовый ssl.conf для примера:
SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect file:/dev/urandom 512
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
# If you use secret phrase
SSLPassPhraseDialog exec:/usr/local/etc/apache2/certs/domain.com.pass
SSLSessionCache dbm:/var/run/ssl_scache
SSLSessionCacheTimeout 300
SSLMutex file:/var/run/ssl_mutex
<VirtualHost 192.168.0.1:443>
<Directory /home/domain.com/htdocs>
Order Allow,Deny
Allow from all
</Directory>
DocumentRoot "/home/domain.com/htdocs"
ServerName secure.domain.com:443
ServerAdmin you@example.com
ErrorLog /home/logs/httpsd-error.log
TransferLog /home/logs/httpsd-access.log
SSLEngine on
SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM
SSLCertificateFile /usr/local/etc/apache2/certs/domain.com.crt
SSLCertificateKeyFile /usr/local/etc/apache2/certs/domain.com.key
<FilesMatch "\.(cgi|shtml|phtml|php3?)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/home/domain.com/htdocs">
SSLOptions +StdEnvVars
</Directory>
SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog /home/logs/httpd-ssl_request.log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
Apache
Apache, ssl
SSLv2 уже давно не обеспечивает приемлемого уровня безопасности и поэтому желательно отключить его в mod_ssl. Для этого в виртуалхосте апача надо прописать:
SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM
Рестартуем Апач и проверяем:
/usr/bin/openssl s_client -state -debug -ssl2 -connect mysite.com:443
Должна появиться ошибка в невозможности хэндшейка.
А так должно нормально подключиться:
/usr/bin/openssl s_client -state -debug -ssl3 -connect mysite.com:443
Apache, безопасность
Apache, ssl