最近要搭一個https的測試環境,使用nginx作反向代理。html
網上找過很多資料,但過程不是很完整,吃了很多虧,故把本身的操做過程總結下來。若是你恰好遇到這個問題,但願對你有幫助!java
********************************分割線*************************nginx
使用java自帶jdk生成ssl自簽名證書(以生成uat環境的ssl證書爲例)redis
一、打開cmd命令窗口,指定使用RSA算法生成一個頒發證書的機構,算法
執行命令:keytool -genkey -alias uat -keypass password -keyalg RSA -keysize 1024 -validity 365 -keystore D:/UAT/KEY/uat.keystore -storepass passwordwindows
二、使用export命令導出cer證書:瀏覽器
執行命令:keytool -export -alias uat -keystore D:/UAT/KEY/uat.keystore -storepass password -rfc -file D:/UAT/KEY/uat.cer工具
三、由於keytool不提供命令導出私鑰,因此須要編寫java類導出key,測試類以下:測試
package test; 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值以下:spa
-----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的內容粘貼到這個文件夾裏面:
四、到這一步,已經能夠將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),如:
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訪問。由於是自簽名的證書,因此瀏覽器訪問時須要先手動信任一下。
各步驟命令彙總:
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