本文借鉴以下文章:
http://reallifejava.com/configuring-ssl-in-wildfly-8/
http://www.360doc.com/content/12/0405/13/3200886_201082456.shtml
http://xeseo.blog.163.com/blog/static/5632431620130825428120/
http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
一、基础概念
证书与编码:
本质上,X.509证书是一个数字文档,这个文档根据RFC 5280来编码并/或签发。
实际上,“X.509证书”经常被用来指代IETF的PKIX(Public Key Infrastructure)证书和X.509 v3 证书标准中的CRL(Certificate Revocation List)。
编码(也用于扩展名)
.DER = 扩展名DER用于二进制DER编码的证书。这些证书也可以用CER或者CRT作为扩展名。比较合适的说法是“我有一个DER编码的证书”,而不是“我有一个DER证书”。
.PEM = 扩展名PEM用于ASCII(Base64)编码的各种X.509 v3 证书。文件开始由一行"—– BEGIN …“开始。
常用的扩展名
.CRT = 扩展名CRT用于证书。证书可以是DER编码,也可以是PEM编码。扩展名CER和CRT几乎是同义词。这种情况在各种unix/linux系统中很常见。
.CER = CRT证书的微软型式。可以用微软的工具把CRT文件转换为CER文件(CRT和CER必须是相同编码的,DER或者PEM)。扩展名为CER的文件可以被IE识别并作为命令调用微软的cryptoAPI(具体点就是rudll32.exe cryptext.dll, CyrptExtOpenCER),进而弹出一个对话框来导入并/或查看证书内容。
.KEY = 扩展名KEY用于PCSK#8的公钥和私钥。这些公钥和私钥可以是DER编码或者PEM编码。
CRT文件和CER文件只有在使用相同编码的时候才可以安全地相互替代。
二、自行颁发不受浏览器信任的SSL证书
1.生成一个RSA密钥和公钥
openssl genrsa -des3 -out 33iq.key 1024
openssl rsa -in 33iq.key -pubout -out 33iq.pub
2.拷贝一个不需要输入密码的密钥文件
openssl rsa -in 33iq.key -out 33iq_nopass.key
3.生成一个证书请求
openssl req -new -key 33iq.key -out 33iq.csr
4.自己签发证书
openssl x509 -req -days 365 -in 33iq.csr -signkey 33iq.key -out 33iq.crt
ps
第3个命令是生成证书请求,会提示输入省份、城市、域名信息等,重要的是,email一定要是你的域
名后缀的。这样就有一个 csr 文件了,提交给 ssl 提供商的时候就是这个 csr 文件。当然我这里
并没有向证书提供商申请,而是在第4步自己签发了证书。
三、编辑配置文件nginx.conf,给站点加上HTTPS协议
server {
server_name YOUR_DOMAINNAME_HERE;
listen 443;
ssl on;
ssl_certificate /usr/local/nginx/conf/33iq.crt;
ssl_certificate_key /usr/local/nginx/conf/33iq_nopass.key;
# 若ssl_certificate_key使用33iq.key,则每次启动Nginx服务器都要求输入key的密码。
}
四、只针对注册、登陆进行https加密处理
既然HTTPS能保证安全,为什么全世界大部分网站都仍旧在使用HTTP呢?使用HTTPS协议,对服务器来说是很大的负载开销。从性能上考虑,我 们无法做到对于每个用户的每个访问请求都进行安全加密(当然,Google这种大神除外)。作为一个普通网站,我们所追求的只是在进行交易、密码登陆等操 作时的安全。通过配置Nginx服务器,可以使用rewrite来做到这一点。既然HTTPS能保证安全,为什么全世界大部分网站都仍旧在使用HTTP呢?使用HTTPS协议,对服务器来说是很大的负载开销。从性能上考虑,我 们无法做到对于每个用户的每个访问请求都进行安全加密(当然,Google这种大神除外)。作为一个普通网站,我们所追求的只是在进行交易、密码登陆等操 作时的安全。通过配置Nginx服务器,可以使用rewrite来做到这一点。
在https server下加入如下配置:
if ($uri !~* "/logging.php$")
{
rewrite ^/(.*)$ http://$host/$1 redirect;
}
在http server下加入如下配置:
if ($uri ~* "/logging.php$")
{
rewrite ^/(.*)$ https://$host/$1 redirect;
}
这样用户会且只会在访问logging.php的情况下,才会通过https访问。
有一些开发框架会根据 $_SERVER[‘HTTPS’] 这个 PHP 变量是否为 on 来判断当前的访问请求是否是使用 https。为此我们需要在 Nginx 配置文件中添加一句来设置这个变量。遇到 https 链接重定向后会自动跳到 http 问题的同学可以参考一下。
server {
...
listen 443;
location \.php$ {
...
include fastcgi_params;
fastcgi_param HTTPS on; # 多加这一句
}
}
server {
...
listen 80;
location \.php$ {
...
include fastcgi_params;
}
}
四、wildfly ssl认证
A.制作证书
1.生成一个RSA密钥和公钥:
openssl genrsa -des3 -out domain.key 1024
openssl rsa -in domain.key -pubout -out domain.pub
2.拷贝一个不需要输入密码的密钥文件:
openssl rsa -in domain.key -out domain_nopass.key
3.生成一个证书请求:
openssl req -new -key domain.key -out domain.csr
4.CA认证,此处自己给自己认证:
openssl x509 -req -days 365 -in domain.csr -signkey domain.key -out domain.crt
5.创建pkcs12文件:
openssl pkcs12 -export -in domain.crt -inkey domain.key -out domain.p12 -name default -CAfile domain.crt -caname root
6.导入keystore文件:
keytool -importkeystore -deststorepass -destkeypass -destkeystore domain.jks -srckeystore domain.p12 -srcstoretype PKCS12 -srcstorepass -alias default
B.wildfly文件配置
PS1:wildfly运行模式为standalone,wildfly解压包路径为/opt/wildfly-8.1.0.Final,需修改文件/opt/wildfly-8.1.0.Final/standalone/configuration/standalone.xml
PS2:在configuration下新建文件夹openssl,将生成的keystore文件复制到此文件夹下
<server xmlns="urn:jboss:domain:2.1">
<extensions>
<extension module="org.jboss.as.clustering.infinispan"/>
……
<extension module="org.wildfly.extension.undertow"/>
extensions>
<management>
<security-realms>
<security-realm name="SslRealm"> #此段为添加
<server-identities>
<ssl>
<keystore path="openssl/domain.jks" relative-to="jboss.server.config.dir" keystore-password="8546356"/>
ssl>
server-identities>
security-realm>
……
security-realm>
management>
<profile>
<subsystem xmlns="urn:jboss:domain:undertow:1.1">
<buffer-cache name="default"/>
<server name="default-server">
<https-listener name="default-ssl" socket-binding="https" security-realm="SslRealm"/> #此行替换原有语句
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content"/>
<filter-ref name="server-header"/>
<filter-ref name="x-powered-by-header"/>
host>
server>
<servlet-container name="default">
<jsp-config/>
servlet-container>
<handlers>
<file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
handlers>
<filters>
<response-header name="server-header" header-name="Server" header-value="WildFly/8"/>
<response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
filters>
subsystem>
……
profile>
C.tomcat文件配置
PS1:tomcat是从官网(http://tomcat.apache.org/download-70.cgi)下载的二进制包,解压包路径为/opt/apache-tomcat-7.0.59,需修改文件/opt/apache-tomcat-7.0.59/conf/server.xml
PS2:将生成的keystore文件复制到/opt/apache-tomcat-7.0.59/conf文件夹下
PS3:tomcat server.xml文件自带ssl相关配置,修改即可
修改前ssl部分被注释掉:
修改后:
port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="150" enableLookups="false" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="conf/domain.jks" keystorePass="8546356" />