昨天了解了一下ssl相关知识,而后动手将web服务器增长ssl访问支持。html
服务器是——nginx反向代理+tomcat做为web服务器——这样的体系架构。nginx
首先,使用openssl生成相关秘钥文件和证书,网上有许多这方面的资源,这里再也不赘述。web
而后,要判断nginx当前版本是否已经安装了ssl模块。将下面的代码写入nginx配置文件:后端
listen 443 ssl; ssl_certificate /data/security/ssl_key_for_nginx.crt; ssl_certificate_key /data/security/ssl_key_for_nginx.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;
而后执行nginx配置文件的测试命令:tomcat
[root@iZ25qrs2oacZ sbin]# ./nginx -t
若是成功,说明支持ssl模块,不然,须要追加安装支持https的模块。安全
进入nginx的source目录,执行下列命令:bash
./configure --prefix=/opt/nginx --with-http_stub_status_module --with-http_ssl_module --with-zlib --with-pcre make make install
安装完毕后,将下面的代码插入nginx配置文件中(这里参考了红薯的文章):服务器
server { listen 443 ssl; ssl_certificate /data/security/ssl_key_for_nginx.crt; ssl_certificate_key /data/security/ssl_key_for_nginx.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; server_name myserver.com; location ~* ^(.*)$ { proxy_set_header host myserver.com; proxy_pass http://localhost:8080; } }
执行测试并经过。若是须要强行将http请求转换成https请求的话,再加上以下代码便可:markdown
server { listen 80; server_name myserver.com; rewrite ^(.*) https://$server_name$1 permanent; }
至此,外部对本服务器能够发起https请求了,nginx会将该请求转发至后台tomcat的8080端口。session
**************************************分割线****************************************************
这里须要说明一点:红薯的文章中提到,在后端tomcat的server.xml文件中的,必须加入 proxyPort=443,不然会形成Tomcat 中的应用在读取 getScheme() 方法以及在 web.xml 中配置的一些安全策略会不起做用。这个我没有作测试,可是,若是https对应用是透明的话,这个也就不重要了。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" proxyPort="443"/>
补充:openssl 生成秘钥和证书的命令:
openssl genrsa -des3 -out my.key 1024 openssl req -new -key my.key -out my.csr openssl req -new -x509 -key my.key -out my.crt -days 3650
其中,my.key是RSA秘钥文件,my.crt是证书文件,my.csr是证书申请文件
参考资料:
http://www.oschina.net/question/12_213459#tags_nav http://www.cnblogs.com/yanghuahui/archive/2012/06/25/2561568.html