在web中使用HTTPS

分類:IT技術 時間:2017-09-26

背景

目前網上流行的是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證書的路徑,根據實際情況修改。

參考列表

  1. Enable HTTPS in Spring Boot
    這篇文章介紹了如何以最快的方式實現啟用HTTPS,沒有涉及CA認證的描述。
  2. tomcat/apache+https單&雙向認證
    這篇文字介紹了多種認證方式的證書生成命令,介紹了基於web容器的證書配置和瀏覽器的數字證書導入。
  3. howto configure ssl
    這是spring-boot官方文檔的一小節,介紹了如何配置ssl。

Tags: 證書 使用 協議 端口 生成 服務器

文章來源:


ads
ads

相關文章
ads

相關文章

ad