建立自己的CA,簽署自己的服務器證書,配置自己的https站點

一、目標

從頭開始配置一個自己的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證書已經加入系統信任列表

今天很晚了,明天有空我就接着整理客戶端證書和客戶端驗證的例子。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章