一、目標
從頭開始配置一個自己的https站點,並讓本機瀏覽器信任站點。
二、商用步驟
1. 創建自己的私鑰
2. 創建CSR(Cerificate Signing Request)
3. 發送CSR給CA,獲取證書文件
4. 部署私鑰和證書文件到服務器端,完成https站點的配置。
三、實驗步驟
由於CA簽署證書文件需要一定的條件(時間,金錢),在實驗階段不太切合實際。所以實驗或者測試過程中一般都是搭建自己的CA,用自己的CA簽署證書。步驟如下:
1. 創建自己的CA
2. 創建測試用的私鑰
3. 創建CSR
4. 用自己的CA簽署CSR獲取證書文件
5. 部署私鑰和證書文件到服務器端,完成https站點的配置。
接下來我就按照試驗步驟來詳細講解。
四、創建自己的CA
在這裏我們用openssl作爲創建CA的工具。由於我的系統是windows的,所以就用cygwin自帶的openssl演示,如果是linux系統一般都默認安裝了openssl,直接使用即可。
1. 首先我們新建一個目錄root-ca
2. 切換到這個目錄
cd root-ca
3.在目錄下創建一個文本文件root-ca.conf 內容如下:
[default]
name = root-ca
domain_suffix = example.com
aia_url = http://$name.$domain_suffix/$name.crt
crl_url = http://$name.$domain_suffix/$name.crl
ocsp_url = http://ocsp.$name.$domain_suffix:9080
default_ca = ca_default
name_opt = utf8,esc_ctrl,multiline,lname,align
[ca_dn]
countryName = "CN"
organizationName = "Example"
commonName = "Root CA"
[ca_default]
home = .
database = $home/db/index
serial = $home/db/serial
crlnumber = $home/db/crlnumber
certificate = $home/$name.crt
private_key = $home/private/$name.key
RANDFILE = $home/private/random
new_certs_dir = $home/certs
unique_subject = no
copy_extensions = none
default_days = 3650
default_crl_days = 365
default_md = sha256
policy = policy_c_o_match
[policy_c_o_match]
countryName = match
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[req]
default_bits = 4096
encrypt_key = yes
default_md = sha256
utf8 = yes
string_mask = utf8only
prompt = no
distinguished_name = ca_dn
req_extensions = ca_ext
[ca_ext]
basicConstraints = critical,CA:true
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
[sub_ca_ext]
authorityInfoAccess = @issuer_info
authorityKeyIdentifier = keyid:always
basicConstraints = critical,CA:true,pathlen:0
crlDistributionPoints = @crl_info
extendedKeyUsage = clientAuth,serverAuth
keyUsage = critical,keyCertSign,cRLSign
nameConstraints = @name_constraints
subjectKeyIdentifier = hash
[crl_info]
URI.0 = $crl_url
[issuer_info]
caIssuers;URI.0 = $aia_url
OCSP;URI.0 = $ocsp_url
[name_constraints]
permitted;DNS.0=example.com
permitted;DNS.1=example.org
excluded;IP.0=0.0.0.0/0.0.0.0
excluded;IP.1=0:0:0:0:0:0:0:0/0:0:0:0:0:0:0:0
[server_ext]
authorityInfoAccess = @issuer_info
authorityKeyIdentifier = keyid:always
basicConstraints = critical,CA:false
crlDistributionPoints = @crl_info
extendedKeyUsage = clientAuth,serverAuth
keyUsage = critical,digitalSignature,keyEncipherment
subjectKeyIdentifier = hash
subjectAltName = DNS:www.example.com,DNS:example.com
#特別說明,如果你的機器沒有域名,就用你的機器名代替這裏的exmaple.com
#在瀏覽器訪問的時候也不要用localhost或者ip地址,直接用機器名,要不然證書不會識別成功
[client_ext]
authorityInfoAccess = @issuer_info
authorityKeyIdentifier = keyid:always
basicConstraints = critical,CA:false
crlDistributionPoints = @crl_info
extendedKeyUsage = clientAuth
keyUsage = critical,digitalSignature
subjectKeyIdentifier = hash
4.執行下面一系列命令,創建相關的文件夾和文件
mkdir certs db private
touch db/index
openssl rand -hex 16 > db/serial
echo 1001 > db/crlnumber
5.開始創建CA
openssl req -new -config root-ca.conf -out root-ca.csr -keyout private/root-ca.key
6.簽署CA根證書
openssl ca -selfsign -config root-ca.conf -in root-ca.csr -out root-ca.crt -extensions ca_ext
7.將我們自己的根證書安裝到系統中,windows系統可以直接雙擊root-ca.crt文件進行安裝,安裝時要注意選擇安裝證書到信任的根證書欄目內。如下圖所示:
8.至此,我們就建立好了自己的CA了,並讓自己的系統信任了這個CA,也就是說只要是這個CA頒發的證書或者這個CA的子CA頒發的證書都會被我們的系統信任。特別提醒,根證書是整個信任鏈的最後堡壘,所以除非你能確保這個根證書絕對值得信任,否則絕對不能安裝到授信任的根證書列表裏。
五、創建服務器私鑰、CSR,並用自己的CA頒發服務器證書
1. 新建一個目錄server 並切換到server目錄,新建一個文本文件server.conf,內容如下:
[req]
prompt = no
distinguished_name = dn
req_extensions = ext
input_password = 12345678
[dn]
CN = www.example.com
emailAddress = [email protected]
O = Example Ltd
L = NJ
C = CN
[ext]
subjectAltName = DNS:www.example.com,DNS:example.com
#特別說明,如果你的機器沒有域名,就用你的機器名代替這裏的exmaple.com
#在瀏覽器訪問的時候也不要用localhost或者ip地址,直接用機器名,要不然證書不會識別成功
2. 創建服務器私鑰
openssl genrsa -aes128 -out server-key.pem 2048
3. 創建服務器證書的CSR
openssl req -new -config server.conf -key server-key.pem -out server.csr
4. 用自己的CA簽署這個證書
cd ..\root-ca
openssl ca -config root-ca.conf -in ..\server\server.csr -out ..\server\server.crt -extensions server_ext
5. 至此我們的服務器私鑰以及證書創建完成。
六、搭建並測試我們的HTTPS站點
http服務器有很多種,每種在配置https訪問時用到證書和私鑰格式都不盡相同。這裏選取tomcat7作爲我們的目標服務器來演示。
1. 轉換我們的私鑰以及證書格式
由pem格式轉成pkcs12格式
openssl pkcs12 -export -in ..\server\server.crt -inkey ..\server\server-key.pem -out server.pk12 -name server
2. 修改tomcat配置文件conf\server.xml,加入如下connector:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" keystoreFile=".\jks\server.pk12"
keystorePass="12345678" ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_RC4_128_SHA
" />
3.啓動tomcat
4.從瀏覽器訪問,這時可以看到瀏覽器已經識別服務器證書了,這是因爲我們的root證書已經加入系統信任列表
今天很晚了,明天有空我就接着整理客戶端證書和客戶端驗證的例子。