nginx 配置自签名的ssl证书

如下内容所有为转载自http://www.javashuo.com/article/p-hcfpguym-ku.htmlhtml

最近要搭一个https的测试环境,使用nginx作反向代理。java

网上找过很多资料,但过程不是很完整,吃了很多亏,故把本身的操做过程总结下来。若是你恰好遇到这个问题,但愿对你有帮助!nginx

 

********************************分割线*************************redis

使用java自带jdk生成ssl自签名证书(以生成uat环境的ssl证书为例)算法

 

一、打开cmd命令窗口,指定使用RSA算法生成一个颁发证书的机构,windows

执行命令:keytool -genkey -alias uat -keypass password -keyalg RSA -keysize 1024 -validity 365 -keystore D:/UAT/KEY/uat.keystore -storepass password浏览器

 

二、使用export命令导出cer证书:工具

执行命令:keytool -export -alias uat -keystore D:/UAT/KEY/uat.keystore -storepass password -rfc -file D:/UAT/KEY/uat.cer测试

三、由于keytool不提供命令导出私钥,因此须要编写java类导出key,测试类以下:spa

import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
 
import sun.misc.BASE64Encoder;
 
public class SslKey {
 
    public static KeyStore getKeyStore(String keyStorePath, String password) throws Exception {
        FileInputStream is = new FileInputStream(keyStorePath);
        KeyStore ks = KeyStore.getInstance("JKS");
        ks.load(is, password.toCharArray());
        is.close();
        return ks;
    }
 
    public static PrivateKey getPrivateKey() {
        try {
            BASE64Encoder encoder = new BASE64Encoder();
            KeyStore ks = getKeyStore("D:/UAT/key/uat.keystore", "password");
            PrivateKey key = (PrivateKey) ks.getKey("uat", "password".toCharArray());
            String encoded = encoder.encode(key.getEncoded());
            System.out.println("-----BEGIN RSA PRIVATE KEY-----");
            System.out.println(encoded);
            System.out.println("-----END RSA PRIVATE KEY-----");
            return key;
        } catch (Exception e) {
            return null;
        }
    }
 
    public static void main(String[] args) {
        getPrivateKey();
    }
 
}

算出key值以下:

-----BEGIN RSA PRIVATE KEY-----
MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAI4MMsT9ZUQg2ADjy2D3ZLxCz3QJ
mWX6TNzn66tsTCE1Dn+5WFwfL3tUSgcT+YHW6v6XG2Ph0d+4BHR9pvWtkcOi5YOt3MIcgwcWooez
5IyCTbGEYEpjtA6h2HVJs0fYZ2tf80KM4oxw3tW5sNXRNwtJ6rNiJ0lNbNgS4iWkXpyNAgMBAAEC
gYEAgFw5jJVG6zeaucMfR7KHTzA4cy0xd1umFYFmD3Q/n0ponbaJSEXODG5wrtC4CUKC/CjkUXAA
zV9mdzYMp7l/G6Tg2d47j7wRMfPSFi/Z/Q3p5bjV+hf2FOREuGB3L7NvaxpGXn+/Jw1eU6XGYHFT
t4BNeNgH/UNxfpGOqRAAMCkCQQDZ84LI2IQT2yzGVYsJbm1sDkZxVINSMlVF2AjJV0F1VHfCzogX
S979jG+ohQ18kjapC8ae9BG03dbhcMPff3irAkEApth4ZVE65angMCyTQJjoINfJeIKYsc0Og/H7
sM0+rvM/GTUvmIjx9GRrh9IlThBihp56EM55lsh0Go2ZEi6vpwJABCZ+9xQob7hcweofG67eppAf
B0l0trv+o7XZdPwUYweYwDzumoL3XBywg6UE/LpMECwJPD2pmKggz2o2UKs8wQJAXKkKLFKxoAz5
KigHW6/P8zWEeb4l6VEVx6ejfaxvLKCBIZHNLiyYG3+NzK+j8jfdUCBBcIYLNvd6q6iKI3P0LwJB
AKkB/YAmvhS219fo2nDP4ds/ICe2xsatum2Yc29nihKQ2p/5DxhLfBaSfoeb21+wpX9b5BrNxM/w
BKoG0YUvsjQ=
-----END RSA PRIVATE KEY-----

新建一个uat.key命名的文件,把key的内容粘贴到这个文件夹里面:

 

说明:第四步经本博主(Garc)实验,发现好像不须要这一步骤,固然了,若是如下问题的,能够经过第四步骤解决

 

四、到这一步,已经能够将cer证书(若须要crt证书,能够直接把cer证书文件的后缀改成crt便可)配置到nginx中使用,可是使用此时的key须要每次访问的时候输入一次密码,至关麻烦。因此最好对key文件再ssl免密码操做一次。步骤以下:

在windows上安装openssl转换工具:

Win64OpenSSL-1_0_2c.exe

vcredist_x64.exe

而后再将openss的bin目录配置到系统环境变量里:

执行命令:rsa -in D:\UAT\key\uat.key -out D:\UAT\key\uat.key.unsecure

五、把证书文件拷贝到测试环境,并配置nginx的config文件(我事先把uat.cer文件更名为uat.crt),如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

server {

   listen 443;

   server_name www.uat.com;

   ssl on;

   ssl_certificate D:/UAT/KEY/uat.crt;

   ssl_certificate_key D:/UAT/KEY/uat.key.unsecure;

   #charset koi8-r;

 

       access_log  logs/www.uat.com.log  main;

       proxy_set_header       Host $host; 

   proxy_set_header  X-Real-IP  $remote_addr; 

   proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for; 

   proxy_set_header  X-Forwarded-Proto  $scheme;

       location / {

           proxy_pass   http://www.uat.com;

       }

       error_page   500 502 503 504  /error.html;

       location = /error.html {

           root   html;

       }

   }

 

重启nginx便可实现https访问。由于是自签名的证书,因此浏览器访问时须要先手动信任一下。

各步骤命令汇总:

1

2

3

4

5

6

7

keytool -genkey -alias uat -keypass password -keyalg RSA -keysize 1024 -validity 365 -keystore D:/UAT/KEY/uat.keystore -storepass password

 

keytool -export -alias uat -keystore D:/UAT/KEY/uat.keystore -storepass password -rfc -file D:/UAT/KEY/uat.cer

 

--使用SslKey.java转换key

 

OpenSSL> rsa -in D:\UAT\key\uat.key -out D:\UAT\key\uat.key.unsecure