SSL证书

本文借鉴以下文章:

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 <secret password> -destkeypass <secret password> -destkeystore domain.jks -srckeystore domain.p12 -srcstoretype PKCS12 -srcstorepass <secret password used in csr> -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文件复制到此文件夹下
<?xml version='1.0' encoding='UTF-8'?>

<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部分被注释掉:
<!--
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />
-->

修改后:
<Connector 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" />

猜你喜欢

转载自hookupcode.iteye.com/blog/2372847