1. 程式人生 > 其它 >openssl自簽名證書

openssl自簽名證書

證書的作用

1.加密通訊資料
2.驗證物件身份
3.保證資料完整性

自簽名證書是什麼

公認的證書往往都要收費,如果客戶端與服務端都由自己來操控,便可以使用自簽名證書(只是自己認可的證書)

CA簽名證書

就是把我們自己當成認證機構去認證一個證書,客戶端信任該CA證書也代表信任該CA證書籤名的所有自簽名證書

自簽名證書應用場景

1.用於測試環境中需要使用證書時
2.用於構建根CA

自簽名證書分為

1.自簽名私有證書(無法被吊銷)
2.自簽名CA證書(可以被吊銷)

兩種自簽名證書的區別在於

如果私鑰不小心被惡意獲取,私有證書不能被吊銷,那麼黑客有可能偽裝成受信任的客戶端與使用者進行通訊
如果需要建立多個客戶端證書,使用自建簽名證書的方法比較合適,只要給所有客戶端都安裝了CA根證書,那麼以該CA根證書籤名過的客戶端證書都是信任的,不需要重複的安裝客戶端證書。

不過因為是自建的CA證書,在使用這個臨時證書的時候,會在客戶端瀏覽器報一個錯誤,簽名證書授權未知或不受信任(signing certificate authority is unknown and not trusted),但只要配置正確,繼續操作並不會影響正常通訊。自簽名證書的issuer和subject是一樣的

openssl是什麼

是一套開源的密碼學工具包
在SSL協議中,我們使用了很多密碼學手段來保護資料,其中包括對稱密碼,公鑰密碼,數字簽名,證書,完整性校驗,偽隨機數生成等。由於這些演算法和操作都非常複雜,於是開源社群就開發了一套庫,這個庫裡面提供了很多現成的標準方法,其他開發者只要正確的呼叫這些方法,就可以實現SSL協議中的各種加密/解密操作了。

使用openssl的私鑰產生公鑰之前,需要了解以下幾點:
1.key演算法:openssl支援生成RSA,DSA,ECDSA的金鑰對,但RSA是目前使用最普遍的
2.key長度:RSA的2048是公認比較安全的key長度
3.密碼(Passphrase):在key上使用密碼是一個可選值,但是一般都是強烈建議的,這樣每次使用key檔案時,都需要輸入密碼才能使用,增強了其安全性,但隨之而來的易用性也會變差。

下面分別闡述如何使用openssl生成這兩種自簽名證書:

生成CA證書

1.生成CA證書的私鑰key(ca.key)。以下輸入了為這個key值設定了密碼,且密碼使用aes128加密儲存:

openssl genrsa -aes128 -out ca.key 2048

Generating RSA private key, 2048 bit long modulus
............+++
................................................................+++
e is 65537 (0x10001)
Enter pass phrase for ca.key:****************
Verifying - Enter pass phrase for ca.key:****************

這個key檔案就是私鑰檔案,可以檢視檔案內容:

cat ca.key 
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,3AA345A5EAEEC76EA555F5A31BBFA8EE

k1L969cTWsZpHRPHcXBGlA29frVQmavNLOBA9Dpd7I0h3wShhPQBEMM0jlmhGjyH
5toPblm1OmSxQfWwpLVXg6beawUHo47lis+o1tHk0Xw857dFuVF6zVFY8NljEWm0
Egev5pBGjlB6i4jnaBS/T7V19sklAqHc8Eb9oT9rhSc5vlBSosKzG+GFFQL4jQV7
0Yv+6KWO4ILZPCZi2llQ3vTO9TKF5ZjjNS506qqilwJQblIgju/wzr3k6Eca1XXZ
bPSVNl0tFpXR/ZwM8S3UabRZG45BPxQ9yqb4dKSJ87HZIm8SO0Y6uuioCiT55zIv
sfU4trvrieCTGbHArYT8WlhAU9x1L7FD9lKy2HQksDC9wlAaCB3QvOExs7r1EEFS
/0zcD+ZGbrhGrXIXeNfrqUzQbEwMEhQ9/RYJYDEEw0ix0KUyXE76jTnx4dHb1s+l
21O9C2MoFlNLxnGYdnZGAYyt9enIGyfFfLeowuGpXyFENEcBe7gCyWwM8KgOtvsW
0AB/cFJpsDXsFxqAsXXc0T9lg4GjbNEJ77mXgn9lM7c8eNjLZ8fFHSl32iDHr4Y7
04Z9ybwXeO3fTg68GKmqkcwOfy8F2cYULcDb2litVVj9HZEW9ytwheU4MwA9NFfl
zlXBq7E8T0xcLQ6P/6AJ0c1opX0KKLBc6H8jHd3vPtHQ2F+7BiyIAK5aS8WV+d7a
S5Rr6aw6d2qOUHCPcWNIdOuoF/jqTzhHuPah68lT7AWJrLG0r7rbT2FpjpPBRxFg
Dbh8piV6akY15yjnR436MosFR3YG4z0oBfJj8tX3Q7x0uU1jJhgv+bK9/lVTQttk
jqPI+VlDHSpSVmVKss1saBYy2KA9/1af6BbaKwzvDwxABpIQt7ggZvo+m3qjV++r
Q8jp9RExQ0Wb2WEDhYzJcBVBKzLHUYVexs/8jppLy46xnWMCrmupoWTlidaaWH6q
yiviIuG9rtufJ46IGJCm6iysq652x6H8v8y1gNarez97TvaX4YcnhLWS8ekop5Mu
4SmRdl84K/YtYa93JHVcnQvATUtlUFJoTx+2GJiDAeqsXu023EzTxmSRMAx5wb4G
9aseIe3QSEfH9ofJQv7qKk4iBJVRsGpruhp57cIdmwFcgncKubpWif95PPmYvcAM
SB+/4kWv44v4gEdeK75F32aEKRoJWWi3rUl8vVnEq+w9BTctM+dWdbtvt7Ztx4SE
ZjbZDUs7pzZy5/U8COZu8E98J5oQAm3TuXhXmvk3chDUAAfAL9z0GdzPBeFYku4X
691JzCgvcMs+URXB0mY6+JW8zyet7VNqqYAEhCmQu4myK1vtOZK0W7WFNsS1RoJF
7pYbPmHMaHtPfW8QuaWnIX+6Y5ikzPs7UURbRA6OFO9JuZjvioAtyamT+3ddWipN
9e6kzK+MtCyfMm1m1rdtwVjJR7PNNfell1PNXmnzAxwgEN4ErN2WXiArFxSGK9ty
EWn1TPypN3KTa95OosREpcjv0TExAlFEJu3ohv+oTQrxy56kEd7sVeamvR5EISiL
XsJR7tkBsbVH+PS9HcsTaOrt8VYW1QXy69qxNY5go090286ADULrxwZqFgPl6wKr
-----END RSA PRIVATE KEY-----

2.生成公鑰

使用命令:
openssl rsa -in ca.key -pubout -out ca-public.key
Enter pass phrase for ca.key:****************
writing RSA key

檢視這個key檔案,就是公鑰:

cat ca-public.key 
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzOofgh69ioDeB9fGVMQd
/sCgfD1xcrRaf6l6ttrIRvtie/ImJEhP3r2KmDEfIKormpUget8tsAxE7uesgaDi
NQzn63YnOz6jiIN9a7as08kL1GyCexF0KFj27hMDcbNDIMZA+i+tLruuExnAdj4f
48T5kA6wiEWXVgPONbHixDrOkcSKQQq1KfV0raFxMX/PyY+kKgnUR7azBOl8X719
HZwcdpOcg6+qbIHpOYWAGePTNlX4jPEU4eNLhCd+n+pT2OCQnrMEslLFoeoYgCvm
RSnv/Guh94JKBTmXDoIGyZf5EB2+pEDsyyBxETgOa2ljJHALdqPAjdjp0sT+JG2U
LwIDAQAB
-----END PUBLIC KEY-----

3.生成CA的自簽名證書ca.crt,此處的CA證書也是一個自簽名證書

openssl req -new -x509 -days 365 -key ca.key -out ca.crt
# 輸入上面ca.key的密碼後,根據自身測試環境的情況輸入相應的資訊,在Common Name選項中填寫你要使用的域名
Enter pass phrase for ca.key:****************
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) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:devops03.com
Email Address []:

以下命令可以不用在呼叫金鑰檔案的時候輸入密碼:

openssl rsa -in ca.key -out ca.key 
Enter pass phrase for ca.key:****************
writing RSA key

檢視自簽名證書資訊(頒發者):

openssl x509 -in ca.crt -subject -issuer -noout

subject= /C=CN/L=Default City/O=Default Company Ltd/CN=devops03.com
issuer= /C=CN/L=Default City/O=Default Company Ltd/CN=devops03.com
使用CA證書籤名自簽名證書

步驟:也就是獲取權威機構辦法的證書(此處為我們剛才生成的CA證書),需要先得到私鑰的key檔案(.key),然後使用私鑰的key檔案生成sign req檔案(.csr檔案),最後把csr檔案發給權威機構,等待權威機構認證,認證成功後,會返回證書檔案(.crt)。

1.生成自簽名證書私鑰key(server.key)檔案

openssl genrsa -aes128 -out server.key 2048 

Generating RSA private key, 2048 bit long modulus
...................+++
.........................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:****************
Verifying - Enter pass phrase for server.key:****************

2.利用私鑰server.key檔案生成自簽名證書請求檔案server.csr
生成csr檔案時,需要填寫一些關於待籤人或者公司的一些資訊,比如國家明,省份名,組織機構名,主機名,email名,有些資訊可以不填寫,使用.標識。

openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
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) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:devops03.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:****************
An optional company name []:

輸入相應的資訊後可以得到server.csr請求檔案

3.使用CA證書對自簽名證書請求檔案進行簽名,生成server.crt

openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
Signature ok
subject=/C=CN/L=Default City/O=Default Company Ltd/CN=devops03.com
Getting CA Private Key

openssl生成root CA及簽發證書

有時,使用SSL協議是自己內部伺服器使用的,這時可以不必找第三方權威的CA機構做證書,可以做自簽證書(自己建立root CA(非權威)。
主要有以下三個步驟:
A.建立openssl.cnf在使用default-ca時需要使用的SSL的工作目錄(第一次必須要設定)
1.檢視openssl的配置檔案

openssl version -a
OpenSSL 1.0.2k-fips  26 Jan 2017
built on: reproducible build, date unspecified
platform: linux-x86_64
options:  bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx) 
compiler: gcc -I. -I.. -I../include  -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches   -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DRC4_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM
OPENSSLDIR: "/etc/pki/tls"
engines:  rdrand dynamic 

2.找到OPENSSLDIR: "/etc/pki/tls"的配置檔案openssl.cnf
根據配置檔案下的[ CA_default ]節點預設值,建立對應資料夾和檔案。

[ CA_default ]

dir             = /etc/pki/CA           # Where everything is kept
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.

certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem# The private key
RANDFILE        = $dir/private/.rand    # private random number file

按順序在/etc/pki/CA下執行以下命令建立資料夾和檔案:

mkdir certs(預設應該是存在的)存放已頒發的證書
mkdir newcerts(預設應該是存在的)存放CA指令生成的新證書
mkdir private(預設應該是存在的)存放私鑰
mkdir crl(預設應該是存在的)存放已吊銷的證書
touch index.txt  openssl定義的已簽發證書的文字資料庫檔案,這個檔案通常在初始化的時候是空的
echo 01>serial   證書籤發時使用的序列號參考檔案,該檔案的序列號是以16進位制格式進行存放的,該檔案必須提供幷包含一個有效序列號

執行完成後,當前目錄為:

[root@prometheus01 /etc/pki/CA]# ll
total 4
drwxr-xr-x. 2 root root 6 Jan 18 21:56 certs
drwxr-xr-x. 2 root root 6 Jan 18 21:56 crl
-rw-r--r--  1 root root 0 Mar 28 16:45 index.txt
drwxr-xr-x. 2 root root 6 Jan 18 21:56 newcerts
drwx------. 2 root root 6 Jan 18 21:56 private
-rw-r--r--  1 root root 1 Mar 28 16:45 serial

B:生成CA根證書(root ca證書)
步驟:生成CA私鑰(.key) --> 生成CA證書請求(.csr) --> 自簽名得到根證書(.crt)(CA給自己頒發的證書)。

1.生成私鑰ca.key
openssl genrsa -out ca.key 2048

2.生成csr請求檔案
openssl req -new -key ca.key -out ca.csr

3.生成ca根證書 ca.crt
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

C.用自籤根證書ca.crt給使用者證書籤名。
步驟:生成私鑰(.key) --> 生成證書請求(.csr) --> 用CA根證書籤名得到證書(.crt)

1.openssl genrsa -out server.key 1024
2.openssl req -new -key server.key -out server.csr
3.openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key 

D.證書的簡單使用
把server.crt以及server.key儲存在伺服器端等待程式載入使用。
把ca.key儲存在客戶端,如果客戶端需要驗證伺服器端發的證書時使用。

nginx官方文件中有關自簽名證書的生成步驟:

Generate Certificates
To generate dummy certficates you can do this steps:

cd /usr/local/nginx/conf
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Configure the new certificate into nginx.conf:

server {

    server_name YOUR_DOMAINNAME_HERE;
    listen 443;
    ssl on;
    ssl_certificate /usr/local/nginx/conf/server.crt;
    ssl_certificate_key /usr/local/nginx/conf/server.key;

}

Restart Nginx.

Now all ready to access using:

https://YOUR_DOMAINNAME_HERE

RSA是非對稱加密,需要用兩個金鑰來加密和解密,這兩個金鑰是公鑰和私鑰