一、获取证书


实现Https首先需要向管理机构申请证书,而我们此次由于是练习目的,所以通过Openssl自己生成证书。首先我们需要用到生成证书的Openssl软件。


Window环境,步骤如下:


1. 安装Openssl


  下载地址:http://slproweb.com/products/Win32OpenSSL.html

        (根据系统选择32位或者64位版本下载安装)。


  下载完成后,进行安装,我安装在了 C:\OpenSSL-Win64文件夹中。


2. 安装ActivePerl 


    此软件目的为了解析pl文件,部分系统不安装也可以实现本教程的功能,安装该软件目的为了学习perl。


  下载地址:http://www.activestate.com/activeperl/downloads/

        (根据系统选择win32或者win64版本下载安装)。


3. 配置环境变量


    在环境变量中添加环境变量


    变量名: OPENSSL_HOME            

    变量值: C:\OpenSSL-Win64;        (变量值为openssl安装位置)

    在path变量结尾添加如下 : %OPENSSL_HOME%\bin;

        

4. 生成证书   


(1) 首先在 nginx安装目录中创建ssl文件夹用于存放证书。

         

 比如我的文件目录为 C:\nginx\ssl

 以管理员身份进入命令行模式,进入ssl文件夹,命令为: 

cd c:/nginx/ssl



(2) 创建私钥

          

在命令行中执行命令: (lee文件名可以自定义)

 openssl genrsa -des3 -out lee.key 1024

          

输入密码后,再次重复输入确认密码。记住此密码,后面会用到。



(3)创建csr证书

         

在命令行中执行命令:  (key文件为刚才生成的文件,lee为自定义文件名)

openssl req -new -key lee.key -out lee.csr

         

执行上述命令后,需要输入信息:

E:\ssl>openssl req -new -key lee.key -out lee.csr
Enter pass phrase for lee.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:GhuangDong
Locality Name (eg, city) []:ShenZhen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:lee
Organizational Unit Name (eg, section) []:lee
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:xxx@xx.xxx
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


输入的信息中最重要的为 Common Name,

这里输入的域名即为我们要使用https访问的域名。


以上步骤完成后,ssl文件夹内出现两个文件:lee.csr 和 lee.key



(4)去除密码。

        

在加载SSL支持的Nginx并使用上述私钥时除去必须的口令,否则会在启动nginx的时候需要输入密码。

        

复制lee.key并重命名为lee.key.org 


可以使用此命令行,也可以使用鼠标操作     

copy lee.key lee.key.org

    

去除口令,在命令行中执行此命令:  (lee为自定义文件名)

openssl rsa -in lee.key.org -out lee.key

         

 此命令需要输入刚才设置的密码。   



(5)生成crt证书

        

在命令行中执行此命令:(lee为自定义文件名)

openssl x509 -req -days 365 -in lee.csr -signkey lee.key -out lee.crt

  

 证书生成完毕,ssl文件夹中一共生成如下4个文件,我们需要使用到的是lee.crt和lee.key。



修改配置


而本配置的方案是浏览器和 Nginx 之间走的 HTTPS 通讯,

而 Nginx 到 Tomcat 通过 proxy_pass 走的是普通 HTTP 连接。


则需修改以下配置信息:


1. Nginx配置文件(nginx.conf):

upstream tomcat {  
   server 127.0.0.1:8080 fail_timeout=0;  
}  

# HTTPS server
server {
   listen       443 ssl;
   server_name  localhost;
   
   # 重点:配置证书文件 .crt 和私钥 .key
   ssl_certificate      /nginx/ssl/testssl.crt;
   ssl_certificate_key  /nginx/ssl/testssl.key;
   
   ssl_session_cache    shared:SSL:1m;
   ssl_session_timeout  5m;
   ssl_ciphers  HIGH:!aNULL:!MD5;
   ssl_prefer_server_ciphers  on;
   
   location / {  
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
       proxy_set_header Host $http_host;  
       proxy_set_header X-Forwarded-Proto https;  
       proxy_redirect off;  
       proxy_connect_timeout      240;  
       proxy_send_timeout         240;  
       proxy_read_timeout         240;  
       # note, there is not SSL here! plain HTTP is used  
       proxy_pass http://tomcat;  
   }  
}


如果需要http强跳到https,则增加以下配置 

server {
   listen 80;
   server_name www.xxx.com xxx.com;                #配置域名地址
   return 301 https://$server_name$request_uri;    #301永久重定向
}



2. Tomcat配置配置文件 (server.xml):


找到<Connector port="8080" protocol="HTTP/1.1" 这一行,修改为:

<Connector port="8080" 
          protocol="HTTP/1.1"  
       connectionTimeout="20000"  
       redirectPort="443"  
       proxyPort="443" /> 


找到HOST标签,添加value值

<Host name="localhost" appBase="webapps" 
       unpackWARs="true" autoDeploy="true">
       
 <!-- 增加以下内容 -->        
 <Valve className="org.apache.catalina.valves.RemoteIpValve"  
     remoteIpHeader="x-forwarded-for"  
     remoteIpProxiesHeader="x-forwarded-by"  
     protocolHeader="x-forwarded-proto" />
   
</Host>


(完)


注意:本文归作者所有,未经作者允许,不得转载