要做這件事情的起因在於,代碼的升級包放在一個https的服務器上,我們的設備要實現升級,則是通過wget 獲取https上的升級包,並且要實現驗證證書的功能,這樣可以防止設備被惡意篡改升級成其他文件包。
起初,https的服務器都已經被搭建好了,可是驗證證書的過程一直不順利,現在把網絡上自己試驗成功方法總結如下,日后出現類似問題方便參考了。
環境:https服務器,Ubuntu12.04+apache2+openssl
首先,理解一下證書的類型。
SSL證書包括:
1,CA證書,也叫根證書或者中間級證書。如果是單向https認證的話,該證書是可選的。不安裝CA證書的話,瀏覽器默認是不安全的。
2,服務器證書,必選項。通過key,證書請求文件csr,再通過CA證書簽名,生成服務器證書。
3,客戶端證書,可選項。若有客戶端證書則是雙向https驗證。
以上所有證書都可以自己生成。
文件后綴
linux系統是不以后綴名來判斷文件類型的,但是為了我們能夠更好地判斷文件用途,所以添加各種后綴。以下是約定成俗的后綴。
*.key:密鑰文件,一般是SSL中的私鑰;
*.csr:證書請求文件,里面包含公鑰和其他信息,通過簽名后就可以生成證書;
*.crt, *.cert:證書文件,包含公鑰,簽名和其他需要認證的信息,比如主機名稱(IP)等。
*.pem:里面一般包含私鑰和證書的信息。
服務器證書的生成
a) 生成服務器私鑰
openssl genrsa -des3 -out server.key 1024
輸入加密密碼,用 128 位 rsa 算法生成密鑰,得到 server.key 文件。
b) 生成服務器證書請求( CSR )
openssl req -new -key server.key -out server.csr
CSR( Certificate Signing Request)是一個證書簽名請求,在申請證書之前,首先要在服務器上生成 CSR ,並將其提交給 CA 認證中心, CA 才能簽發 SSL 服務器證書。也可以認為, CSR 就是一個在服務器上生成的證書。
在生成這個文件的過程中,有一點需要特別注意,Common Name 填入主機名(或者服務器IP)。
c) 自己生成服務器證書
如果不使用 CA 證書簽名的話,用如下方式生成:
openssl req -x509 -days 1024 -key server.key -in server.csr > server.crt
用服務器密鑰和證書請求生成證書 server.crt , -days 參數指明證書有效期,單位為天。商業上來說,服務器證書是由通過第三方機構頒發的,該證書由第三方認證機構頒發的。
如果使用 CA 證書簽名,用 openssl 提供的工具 CA.sh 生成服務器證書:
mv server.csr newreq.pem
./CA.sh -sign
mv newcert.pem server.crt
簽名證書后,可通過如下命令可查看服務器證書的內容:
openssl x509 -noout -text -in server.crt
可通過如下命令驗證服務器證書:
openssl verify -CAfile ca.crt server.crt
客戶證書的生成
客戶證書是可選的。如果有客戶證書,就是雙向認證 HTTPS ,否則就是單向認證 HTTPS 。
a) 生成客戶私鑰
openssl genrsa -des3 -out client.key 1024
b) 生成客戶證書簽名請求
openssl req -new -key client.key -out client.csr
c) 生成客戶證書(使用 CA 證書簽名)
openssl ca -in client.csr -out client.crt
d) 證書轉換成瀏覽器認識的格式
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.pfx
證書列表
如果使用雙向認證,就會有三個私鑰和三個證書。分別是 ca.key, ca.crt, server.key, server.crt, client.key, client.crt ,以及給瀏覽器的 client.pfx 。
如果使用有 CA 證書的單向認證,證書和私鑰就是 ca.key, ca.crt, server.key, server.crt 。
如果使用無 CA 證書的單向認證,證書和私鑰就是 server.key, server.crt 。
最后在fedora作為客戶端,wget 1.14通過命令
wget --ca-certificate=server.crt https://+ip+file 成功獲取文件,證書驗證通過。