項目自簽名ssl證書,配置https
一、自簽名證書:
准備ssl證書一份,這里使用JDK生成秘鑰證書:
Win+R 輸入cmd,調出命令行窗口

在命令行窗口輸入,生成命令:
keytool -genkey -alias myssl -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore G:\ keystore.p12 -validity 365
(1)關鍵字解釋:
* alias 密鑰別名
* storetype 指定密鑰倉庫類型
* keyalg 生證書的算法名稱,RSA是一種非對稱加密算法
* keysize 證書大小
* keystore 生成的證書文件的存儲路徑 (我這里選擇在G盤下)
* validity 證書的有效期 (這里設置為一年)
(2)生成證書注意:
在輸入證書生成命令之后,會提示輸入:
- 密鑰庫口令:證書密碼,在后面的項目中配置證書時用到
- 姓氏:一般沒什么用,在瀏覽器中查看證書時會顯示,用於正式場合的證書還是需要填寫標准。
- 組織單位:證書使用單位信息,一般沒什么用,在瀏覽器中查看證書時會顯示,用於正式場合的證書還是需要填寫標准。
- 組織單位名稱:證書使用單位名稱,一般沒什么用,在瀏覽器中查看證書時會顯示,用於正式場合的證書還是需要填寫標准。
- 所在的城市或區域名稱:瀏覽器中查看證書信息時會顯示。
- 所在的省/市/自治區名稱:瀏覽器中查看證書信息時會顯示。
- 單位的雙字母國家/地區代碼:國家或地區編碼,瀏覽器中查看證書信息時會顯示。
二、將生成的密鑰證書拷貝到項目中的resource中(也可以不拷貝到項目中,后面配置路徑時配置密鑰證書的絕對路徑即可)

三、修改項目配置文件application.properties,增加如下配置項
server.ssl.key-store=classpath:keystore.p12 #證書文件路徑,也可以配置絕對路徑
server.ssl.key-store-password=jyd666 #證書密碼,證書生成時輸入的密鑰庫口令
server.ssl.keyStoreType=PKCS12 #證書類型,與證書生成命令一致
server.ssl.keyAlias=jydssl #證書別名,與證書生成命令一致
如果是application.yml配置文件:

server:
# 服務器的HTTP端口,默認為80
port: 9999
ssl:
key-store: classpath:keystore.p12 #證書文件路徑
key-store-password: jyd666 #證書密碼
key-store-type: PKCS12 #證書類型
key-alias: jydssl #證書別名
四、之后啟動項目訪問https路徑即可
Linux-nginx配置https
一、需要的環境:
配置nginx支持https協議訪問,需要在編譯安裝nginx的時候添加相應的模塊--with-http_ssl_module
查看nginx編譯參數:/usr/local/nginx/sbin/nginx -V
)
如果沒有--with-http_gzip_static_module這個參數,需要重新編輯nginx
二、創建https證書:
確保機器上安裝了openssl 和 openssl-devel
yum install openssl openssl-devel # CentOS使用yum命令安裝
mkdir /usr/local/nginx/conf/ssl # 創建證書存放目錄
cd /usr/local/nginx/conf/ssl # 進入目錄
創建服務器私鑰:openssl genrsa -des3 -out server.key 1024 #根據提示輸入證書口令
)
- 創立根證書密鑰文件(自己做CA)root.key:
[root@linux ssl]# openssl genrsa -des3 -out root.key
Generating RSA private key, 512 bit long modulus
……………..++++++++++++
..++++++++++++
e is 65537 (0×10001)
Enter pass phrase for root.key: ← 輸入一個新密碼
Verifying – Enter pass phrase for root.key: ← 重新輸入一遍密碼
- 創立根證書的申請文件root.csr:
[root@linux ssl]# openssl req -new -key server.key -out server.csr
Enter pass phrase for root.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 ‘.whflsc.com’, the field will be left blank.
Country Name (2 letter code) [XX]:cn #國家,中國輸入CN
State or Province Name (full name) []:zhejiang #省份
Locality Name (eg, city) [Default City]:hangzhou #城市
Organization Name (eg, company) [Default Company Ltd]:osyunwei #公司
Organizational Unit Name (eg, section) []:sys #部門
Common Name (eg, your name or your server's hostname) []:osyunwei #主機名稱
Email Address []:xxx@qq.com #郵箱
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456 #證書請求密鑰,CA讀取證書的時候需要輸入密碼
An optional company name []:osyunwei #公司名稱,CA讀取證書的時候需要輸入密碼
openssl rsa -in server.key -out server_nopassword.key #對key進行解密
- 創立一個自目前日期起為期十年的根證書root.crt:
[root@linux ssl]# openssl x509 -req -days 3650 -in server.csr -signkey server_nopassword.key -out server.crt
三、修改nginx配置文件,加載ssl證書
修改nginx.conf配置:
[root@linux ssl]# vim /usr/local/nginx/conf/nginx.conf # 編輯
找到 HTTPS server塊,放開除HTTPS server的注釋

進行如下修改:
# HTTPS server
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /usr/local/nginx/conf/ssl/server.crt; #cert/證書名稱.pem;
ssl_certificate_key /usr/local/nginx/conf/ssl/server_nopassword.key; #cert/證書名稱.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://127.0.0.1:9999/; #需要代理的項目路徑
#root html;
#index index.html index.htm;
}
}
:wq! #保存退出
下面是個人的配置:
nginx端口為8888,代理項目端口9999,之后訪問項目只需訪問https://域名或ip/8888
(這里並沒有使用默認端口443,使用其他端口則需要在linux中開放對應的端口,因為linux默認不開放端口,開放端口的方法在后面↓)

配置完成后退出編輯,重啟nginx:
/usr/local/nginx/sbin/nginx -s reload # 重啟nginx
/usr/local/nginx/sbin/nginx -t # 檢查nginx是否啟動成功

四、linux防火牆開啟https協議端口8888
linux中輸入如下命令:
vi /etc/sysconfig/iptables # 編輯防火牆配置文件
添加以下代碼:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT
之后,
:wq! # 保存退出
再重啟防火牆:
service iptables restart #重啟防火牆
鑒於linux版本不同,如果你的linux不支持上述命令,那么用下面的firewall命令:
# 打開8888/TCP端口
firewall-cmd --add-port=8888/tcp
# 永久打開8888/TCP端口
firewall-cmd --permanent --add-port=8888/tcp
# 永久打開端口需要reload一下,臨時打開不用,如果用了reload臨時打開的端口就失效了
# 重啟防火牆
firewall-cmd --reload
# 查看防火牆
firewall-cmd --list-all
ps:關閉端口
firewall-cmd --remove-port=80/tcp --permanent
firewall-cmd --reload
五、訪問項目
自此完畢,訪問項目路徑進行測試。
六、缺少SSL模塊錯誤
若出現nginx:[emerg]unknown directive ssl這個錯誤提示,是因為編譯Nginx的時候並沒有把SSL模塊一起編譯進去。
錯誤解決步驟:
我們只需要在原有的基礎上添加ssl模塊,不需要重新安裝Nginx。
首先,我們cd到當初下載nginx的包壓縮的解壓目錄,我這里的解壓目錄在“/usr/loacl/nginx/”。
進入到解壓目錄下后,按順序執行一下命令:
./configure --with-http_ssl_module # 重新添加ssl模塊
若執行上面這條命令出現錯誤:(./configure:錯誤:SSL模塊需要OpenSSL庫。),是因為缺少了OpenSSL,所以我們要先安裝一個openssl,執行:yum -y install openssl openssl-devel
等待OpenSSL的安裝完成后,再執行./configure --with-http_ssl_module。- 安裝好ssl后執行
make命令,不要執行make install(make是用來編譯的,而make install是安裝,不然整個nginx會被重新覆蓋)。 - 之后在nginx解壓目錄下,objs文件夾中多了一個nginx的文件,把這個新的nginx文件復制過去覆蓋之前的nginx(保險起見先備份一下之前的nginx)。
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp objs/nginx /usr/local/nginx/sbin/nginx - 最后cd到Nginx安裝目錄下,查看ssl模塊安裝是否成功:
./sbin/nginx -V

