背景
目前網上流行的是HTTP協議,HTTPS協議還在逐步推廣的過程中。
HTTP協議以明文發送內容,容易被攻擊者竊聽。HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,並為瀏覽器和服務器之間的通信加密。
HTTP協議和HTTPS協議的默認端口是不一樣的,前者使用80端口,後者使用443端口。
服務器的證書需要到CA申請。CA本身也有自己的證書,客戶端瀏覽器信任CA的證書,從而信任它頒發給其他服務器的證書。
本文介紹的內容是在局域網中使用https,CA是自己生成的。作為服務器的web是基於spring-boot搭建的。
證書的生成是在linux上使用openssl
相關命令實現的。
使用了https協議,就不能再使用http協議。想要同時支持兩種協議需要額外的編程來實現,而且兩者的端口應該是不一樣的。比如在瀏覽器訪問http://www.baidu.com
會重定向到https://www.baidu.com
,但是前者使用的80端口,後者使用的443端口。
兼顧任務的復雜程度和必要程度,我選擇沒有再集成http協議的支持。
證書生成
流程介紹
證書的生成分為CA部分和服務端部分,因為是在局域網內使用,可以由自己來模擬CA的角色。
步驟之間的連接線表示依賴關系,比如指向root.crt的2條連接線表示生成root.crt需要用到root.key和root.csr。
各文件解析
- .key
秘鑰文件 - .csr
證書申請文件 - .crt
證書文件 - .p12
證書文件導出的PKCS12格式,在配置web服務器的時候需要用到
在linux新建一個目錄,比如demo-ca
,然後開始生成證書吧。
CA端證書生成
root.key
[root@master66 demo-ca]# openssl genrsa -des3 -out root.key 2048
Generating RSA private key, 2048 bit long modulus
.......................................+++
......+++
e is 65537 (0x10001)
Enter pass phrase for root.key: <- 輸入密碼(root)
Verifying - Enter pass phrase for root.key: <- 輸入密碼(root)
[root@master66 demo-ca]# ll
total 4
-rw-r--r-- 1 root root 1751 Sep 25 11:26 root.key <- 生成的文件
root.csr
[root@master66 demo-ca]# openssl req -new -key root.key -out root.csr
Enter pass phrase for root.key: <- 輸入key的密碼(root)
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) [XX]:CN
State or Province Name (full name) []:ZheJiang
Locality Name (eg, city) [Default City]:HangZhou
Organization Name (eg, company) [Default Company Ltd]:hikvisioin
Organizational Unit Name (eg, section) []: <- 可以不輸入
Common Name (eg, your name or your server's hostname) []: <- 此時不輸入(根證書自己驗證自己)
Email Address []:[email protected] <- 電子郵箱,可隨意填寫
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: <- 可以不輸入
An optional company name []: <- 可以不輸入
[root@master66 demo-ca]# ll
total 8
-rw-r--r-- 1 root root 1009 Sep 25 11:30 root.csr <- 生成的文件
-rw-r--r-- 1 root root 1751 Sep 25 11:26 root.key
root.crt
[root@master66 demo-ca]# openssl x509 -req -days 3650 -sha256 -extensions v3_ca -signkey root.key -in root.csr -out root.crt
參數-days
設置有效期,上述生成的是10年有效期的證書。
Signature ok
subject=/C=CN/ST=ZheJiang/L=HangZhou/O=hikvisioin/emailAddress=[email protected]
Getting Private key
Enter pass phrase for root.key: <- 輸入key的密碼(root)
[root@master66 demo-ca]# ll
total 12
-rw-r--r-- 1 root root 1216 Sep 25 11:33 root.crt <- 生成的文件
-rw-r--r-- 1 root root 1009 Sep 25 11:30 root.csr
-rw-r--r-- 1 root root 1751 Sep 25 11:26 root.key
服務端證書生成
先創建一個子目錄,用來存放服務器證書相關文件。
[root@master66 demo-ca]# mkdir server
server.key
[root@master66 demo-ca]# openssl genrsa -des3 -out server/server.key 2048
Generating RSA private key, 2048 bit long modulus
.......+++
...............+++
e is 65537 (0x10001)
Enter pass phrase for server/server.key: <- 輸入密碼(server)
Verifying - Enter pass phrase for server/server.key: <- 再次輸入密碼(server)
[root@master66 demo-ca]# ll server/
total 4
-rw-r--r-- 1 root root 1751 Sep 25 12:39 server.key <- 生成的文件
server.csr
[root@master66 demo-ca]# openssl req -new -key server/server.key -out server/server.csr
Enter pass phrase for server/server.key: <- 輸入之前的密碼(server)
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) [XX]:CN
State or Province Name (full name) []:ZheJiang
Locality Name (eg, city) [Default City]:HangZhou
Organization Name (eg, company) [Default Company Ltd]:hikvision
Organizational Unit Name (eg, section) []: <- 可以不輸入
Common Name (eg, your name or your server's hostname) []:PC-LIJINLONG9 <- 主機名,必須填寫正確
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@master66 demo-ca]# ll server/
total 8
-rw-r--r-- 1 root root 1041 Sep 25 12:43 server.csr <- 生成的文件
-rw-r--r-- 1 root root 1751 Sep 25 12:39 server.key
註意
在要求輸入Common Name (eg, your name or your server's hostname)
時,需要輸入服務器的主機名,後續生成的證書是綁定在這個主機名上的。換言之,客戶端使用其他的主機名或者ip來訪問服務器,證書是不起作用的。
server.crt
[root@master66 demo-ca]# openssl x509 -req -days 3650 -sha256 -extensions v3_req -CA root.crt -CAkey root.key -CAcreateserial -in server/server.csr -out server/server.crt
Signature ok
subject=/C=CN/ST=ZheJiang/L=HangZhou/O=hikvision/CN=PC-LIJINLONG9/[email protected]
Getting CA Private Key
Enter pass phrase for root.key: <- 輸入密碼(root)
[root@master66 demo-ca]# ll server/
total 12
-rw-r--r-- 1 root root 1249 Sep 25 12:46 server.crt <- 生成的文件
-rw-r--r-- 1 root root 1041 Sep 25 12:43 server.csr
-rw-r--r-- 1 root root 1751 Sep 25 12:39 server.key
server.p12
[root@master66 demo-ca]# openssl pkcs12 -export -in server/server.crt -inkey server/server.key -out server/server.p12 -name "server"
Enter pass phrase for server/server.key: <- 輸入密碼(server)
Enter Export Password: <- 定義導出密碼(server)
Verifying - Enter Export Password: <- 重復導出密碼(server)
[root@master66 demo-ca]# ll server/
total 16
-rw-r--r-- 1 root root 1249 Sep 25 12:46 server.crt
-rw-r--r-- 1 root root 1041 Sep 25 12:43 server.csr
-rw-r--r-- 1 root root 1751 Sep 25 12:39 server.key
-rw-r--r-- 1 root root 2538 Sep 25 12:50 server.p12 <- 生成的文件
服務端配置
將上文中生成的服務端p12格式證書文件放到項目的resource
目錄下。
配置resource/application.properties
文件:
server.ssl.key-store: classpath:server.p12
server.ssl.key-store-password: server
server.ssl.key-password: server
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: server
完成。
客戶端配置
使用瀏覽器
在hosts文件中配置服務器主機名的映射,註意,主機名必須和上文保持一致(參考server.csr一節),在此處應該是PC-LIJINLONG9
。
將上文生成的root.crt導入瀏覽器。
然後就可以用https協議進行訪問了。
使用curl
修改/etc/hosts
文件,加入主機PC-LIJINLONG9
映射。
在項目根目錄執行命令:
curl https://pc-lijinlong9:8080/index --cacert root.crt
參數項--cacert
指定CA證書的路徑,根據實際情況修改。
參考列表
- Enable HTTPS in Spring Boot
這篇文章介紹了如何以最快的方式實現啟用HTTPS,沒有涉及CA認證的描述。 - tomcat/apache+https單&雙向認證
這篇文字介紹了多種認證方式的證書生成命令,介紹了基於web容器的證書配置和瀏覽器的數字證書導入。 - howto configure ssl
這是spring-boot官方文檔的一小節,介紹了如何配置ssl。
Tags: 證書 使用 協議 端口 生成 服務器
文章來源: