關於自簽名的HTTPS證書籤發介紹

1.前言

現如今互聯網上使用https協議已是大勢所趨。眾所周知,證書有三個作用:

·加密通信

·身份驗證(驗證對方確實是對方聲稱的對象)

·數據完整性(無法被修改,修改了會被知)

故掌握https證書的申請,生成,簽發步驟是極有必要的。

2.名詞解釋

·KEY: 通常指私鑰

·CA: Certificate Authority,電子商務認證授權機構,也稱為電子商務認證中心,是負責發放和管理數字證書的權威機構,並作為電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任。

·CSR: 即Certificate SigningRequest的縮寫,即證書籤名請求,這不是證書,可以簡單理解成公鑰,生成證書時要把這個提交給權威的證書頒發機構。

·CRT/CER: 是certificate的縮寫,即證書。

·X.509: 是一種證書格式。對X.509證書來說,認證者總是CA或由CA指定的人,一份X.509證書是一些標準字段的集合,這些字段包含有關用戶或設備及其相應公鑰的信息。

X.509的證書文件,一般以.crt結尾,根據該文件的內容編碼格式,可以分為以下二種格式:

·PEM 即Privacy Enhanced Mail的縮寫,打開看文本格式,以"-----BEGIN..."開頭, "-----END..."結尾,內容是BASE64編碼。

Apache和nginx服務器偏向於使用這種編碼格式。

·DER 即Distinguished Encoding Rules,打開看是二進制格式,不可讀。

Java和Windows服務器偏向於使用這種編碼格式:

·TLS: 傳輸層安全協議 Transport LayerSecurity的縮寫。

·SSL: 安全套接字層 Secure Socket Layer的縮寫。

·HTTPS協議: 是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

·OpenSSL: 相當於SSL的一個實現。

證書分類

目前主流的SSL證書主要分為DV SSL、OV SSL、EV SSL。

·DV SSL

Domain Validation SSLCertificate,即域名型SSL證書,DV SSL證書是隻驗證網站域名所有權的簡易型(Class 1級)SSL證書,可10分鐘快速頒發,能起到加密傳輸的作用,但無法向用戶證明網站的真實身份。

目前市面上的免費證書都是這個類型的,只是提供了對數據的加密,但是對提供證書的個人和機構的身份不做驗證。

·OV SSL

OrganizationValidation SSL Certificate,即企業型SSL證書。OV SSL提供加密功能,對申請者做嚴格的身份審核驗證,提供可信身份證明。

和DV SSL的區別在於,OV SSL 提供了對個人或者機構的審核,能確認對方的身份,安全性更高。所以這部分的證書申請是收費的。

·EV SSL

Extended ValidationSSL Certificate,即增強型SSL證書。最安全、最嚴格。 超安EV SSL證書遵循全球統一的嚴格身份驗證標準,是目前業界安全級別最高的頂級 (Class 4級)SSL證書。

金融證券、銀行、第三方支付、網上商城等,重點強調網站安全、企業可信形象的網站,涉及交易支付、客戶隱私信息和賬號密碼的傳輸。這部分的驗證要求最高,申請費用也是最貴的。

3.自簽名證書籤發步驟

(1) 創建CA私鑰,為方便使用生成無密鑰保護的私鑰

 $ openssl genrsa -out "cdkfzxCA.key" 2048 

(2) 創建CA根證書請求文件

$ openssl req -new -key "cdkfzxCA.key" -out "cdkfzxCA.csr" -sha256 -subj '/C=CN/ST=BJ/L=BJ/O=CCB/OU=IT/CN=cdkfzx'

(3) 配置CA根證書

$ cat > cdkfzxCA.cnf << EOF
###
[cdkfzxCA]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
###
EOF

(4) 簽發根證書

$ openssl x509 -req -days 3650 -in "cdkfzxCA.csr" -signkey "cdkfzxCA.key" -sha256 -out "cdkfzxCA.crt" -extfile "cdkfzxCA.cnf" -extensions cdkfzxCA

(5) 生成站點ssl私鑰

$ openssl genrsa -out "server.key" 4096

(6) 生成站點證書請求文件

$ openssl req -new -key "server.key" -out "server.csr" -sha256 -subj '/C=CN/ST=BJ/L=BJ/O=CCB/OU=IT/CN=*'

(7) 配置站點服務器證書,生成server.cnf文件

$ cat >server.cnf << EOF
###
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints=critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage=critical,digitalSignature,keyEncipherment
#subjectAltName=DNS:www.test.com,IP:127.0.0.1
#subjectAltName=IP:127.0.0.1
subjectAltName=DNS:www.test.com
subjectKeyIdentifier=hash
##
EOF

(8) 使用根證書籤發站點服務器ssl證書

$ openssl x509 -req -days 750 -in "server.csr" -sha256 -CA "cdkfzxCA.crt" -CAkey "cdkfzxCA.key" -CAcreateserial -out "server.crt" -extfile "server.cnf" -extensions server

(9) 合併證書,形成證書鏈

$ cat server.pem cdkfzxCA.pem > server-chain.cer

其他幾種https證書申請方式

Let’s Encrypt

Let’s Encrypt官網

申請Let’s Encrypt通配符HTTPS證書

阿里雲盾

阿里雲盾申請地址

mkcert

主要用於本地開發時使用。原理是將根證書加入到當前機器的可信證書存儲區域。

mkcert項目地址


PS:目前大部分免費權威證書的申請都是DV類型的SSL證書,還不能針對IP進行簽發。

以下所有web server如果需要使用https,均需要安裝openssl相應依賴。

Apache

1. 編譯安裝時增加相應模塊,動態編譯Apache模塊,便於模塊的加載管理。

$ ./configure --prefix=/usr/local/apache --enable-so --enable-ssl --with-ssl=/usr/local/ssl --enable-mods-shared=all
$ make && make install

2. 打開apache安裝目錄下conf.d目錄中的httpd-ssl.conf文件,在配置文件中添加或編輯如下配置項

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
SSLCertificateFile conf/server.crt #將服務器證書配置到該路徑下
SSLCertificateKeyFile conf/server.key #將服務器證書私鑰配置到該路徑下
#SSLCertificateChainFile conf/ca.crt #刪除行首的“#”號註釋符,並將CA證書ca.crt配置到該路徑下

3. 重啟Apache

$ ./apachectl -k stop
$ ./apachectl -k star

Haproxy

編譯安裝haproxy v1.5及以上版本

1. 解包後進入haproxy目錄進行編譯

$ make TARGET=linux26 USE_OPENSSL=1 ADDLIB=-lz

2. 完成後檢查ssl庫是否正常鏈接

$ ldd haproxy | grep ssl
libssl.so.10 => /usr/lib64/libssl.so.10 (0x0000003067400000)

3. 如果ssl庫鏈接正常就可以進行下一步安裝,此部分是要安裝到的目標目錄

make install PREFIX=/usr/local/haproxy

4. 完成後在配置文件的frontend中加入ssl代碼

 frontend xxx
bind 0.0.0.0:443 ssl crt /usr/local/haproxy/server.pem ciphers HIGH:!aNULL:!MD5

Nginx

1. 編譯安裝時增加相應參數

$ ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_gzip_static_module

2. 修改安裝目錄下的配置文件nginx.conf

server { 
listen 443;
server_name localhost;
ssl on;
ssl_certificate server.pem;
ssl_certificate_key server.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #啟用TLS1.1、TLS1.2要求OpenSSL1.0.1及以上版本,若您的OpenSSL版本低於要求,請使用 ssl_protocols TLSv1;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}

3. 保存退出後,重啟nginx

$ ./nginx -s stop
$ ./nginx

同時在Windows機器中,將CA根證書導入到“受信任的根證書頒發機構”存儲區中,然後通過瀏覽器訪問相應的網站。


分享到:


相關文章: