轉:https://www.jianshu.com/p/0e9ee7ed6c1d
通常自簽的證書等,用來給內部啟用https。
自己建一個CA,然后對自己的請求文件進行認證然后生成證書,私鑰和證書,一共倆
ubuntu上一般都自帶安裝了OpenSSL
ubuntu:~$ openssl
OpenSSL> version
OpenSSL 1.1.1 11 Sep 2018
OpenSSL>help
Standard commands # 標准命令
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dhparam
dsa dsaparam ec ecparam
enc engine errstr gendsa
genpkey genrsa help list
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand rehash
req rsa rsautl s_client
s_server s_time sess_id smime
speed spkac srp storeutl
ts verify version x509
Message Digest commands (see the `dgst' command for more details)
blake2b512 blake2s256 gost md4
md5 rmd160 sha1 sha224
sha256 sha3-224 sha3-256 sha3-384
sha3-512 sha384 sha512 sha512-224
sha512-256 shake128 shake256 sm3
Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb aria-128-cbc aria-128-cfb
aria-128-cfb1 aria-128-cfb8 aria-128-ctr aria-128-ecb
aria-128-ofb aria-192-cbc aria-192-cfb aria-192-cfb1
aria-192-cfb8 aria-192-ctr aria-192-ecb aria-192-ofb
aria-256-cbc aria-256-cfb aria-256-cfb1 aria-256-cfb8
aria-256-ctr aria-256-ecb aria-256-ofb base64
bf bf-cbc bf-cfb bf-ecb
bf-ofb camellia-128-cbc camellia-128-ecb camellia-192-cbc
camellia-192-ecb camellia-256-cbc camellia-256-ecb cast
cast-cbc cast5-cbc cast5-cfb cast5-ecb
cast5-ofb des des-cbc des-cfb
des-ecb des-ede des-ede-cbc des-ede-cfb
des-ede-ofb des-ede3 des-ede3-cbc des-ede3-cfb
des-ede3-ofb des-ofb des3 desx
rc2 rc2-40-cbc rc2-64-cbc rc2-cbc
rc2-cfb rc2-ecb rc2-ofb rc4
rc4-40 seed seed-cbc seed-cfb
seed-ecb seed-ofb sm4-cbc sm4-cfb
sm4-ctr sm4-ecb sm4-ofb
1.基本概念
- CA:認證機構。有自己的證書,可以拿自己的證書給別人簽名然后收錢,這個星球上的CA被幾家說英語的人壟斷了。在這里我們會虛擬出一個CA機構,然后用他來給自己的證書認證簽名。
- (網站)證書 :發送給客戶端的證書,其中大部分是公鑰。是一個包含自己網站的公鑰、認證、簽名等信息的文件。
- (網站)私鑰 :服務器留存的解密私鑰(server)
注意區分 CA機構的證書(可以拿來給其他網站證書簽名)和 自己網站的證書(不可以),不一樣
2.基本流程
-
- 搞一個虛擬的CA機構,生成一個證書
-
- 生成一個自己的密鑰,然后填寫證書認證申請,拿給上面的CA機構去簽名
-
- 於是就得到了自(自建CA機構認證的)簽名證書
2.1 首先,虛構一個CA認證機構出來
# 生成CA認證機構的證書密鑰key
# 需要設置密碼,輸入兩次
openssl> genrsa -des3 -out ca.key 1024
# 去除密鑰里的密碼(可選)
# 這里需要再輸入一次原來設的密碼
openssl> rsa -in ca.key -out ca.key
# 用私鑰ca.key生成CA認證機構的證書ca.crt
# 其實就是相當於用私鑰生成公鑰,再把公鑰包裝成證書
openssl> req -new -x509 -key ca.key -out ca.crt -days 365
# 這個證書ca.crt有的又稱為"根證書",因為可以用來認證其他證書
2.2其次,才是生成網站的證書
用上面那個虛構出來的CA機構來認證,免費
# 生成自己網站的密鑰server.key
openssl> genrsa -des3 -out server.key 1024
# 生成自己網站證書的請求文件
# 如果找外面的CA機構認證,也是發個請求文件給他們
# 這個私鑰就包含在請求文件中了,認證機構要用它來生成網站的公鑰,然后包裝成一個證書
openssl> req -new -key server.key -out server.csr
# 使用虛擬的CA認證機構的證書ca.crt,來對自己網站的證書請求文件server.csr進行處理,生成簽名后的證書server.crt
# 注意設置序列號和有效期(一般都設1年)
openssl> x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -days 365
至此,私鑰server.key和證書server.crt已全部生成完畢,可以放到網站源代碼中去用了。
3.補充
其實后綴名不影響文件的實質內容的,內容都可以文本打開看
- 例如生成的ca.key文件,輸入兩次密碼,然后再查看其內容:
OpenSSL> genrsa -des3 -out ca.key 1024
Generating RSA private key, 1024 bit long modulus (2 primes)
....+++++
...........................................................................+++++
e is 65537 (0x010001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:
OpenSSL> exit
ubuntu:~/web/ssl$ ls
ca.key
ubuntu:~/web/ssl$ cat ca.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,6D519E92415BEE33
UcZyq1NkoodzdWBHq37G2+y+Q/QigaPmXdNjZA7rBbz17VVqB1JrU11tbFo5BDZV
...
-----END RSA PRIVATE KEY-----
ubuntu:~/web/ssl$
- 再如生成ca.crt證書文件:
OpenSSL> req -new -x509 -key ca.key -out ca.crt -days 365
Can't load /home/xqq/.rnd into RNG
139920876560832:error:2406F079:random number generator:RAND_load_file:Cannot open file:../crypto/rand/randfile.c:88:Filename=/home/xqq/.rnd
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) [AU]:cn
State or Province Name (full name) [Some-State]:spn
Locality Name (eg, city) []:ln
Organization Name (eg, company) [Internet Widgits Pty Ltd]:on
Organizational Unit Name (eg, section) []:oun
Common Name (e.g. server FQDN or YOUR name) []:cn
Email Address []:ea
OpenSSL> exit
ubuntu:~/web/ssl$ ls
ca.key ca.crt ca.lol # ca.lol是我自己亂起的擴展名
# ca.lol
ubuntu:~/web/ssl$ cat ca.lol
-----BEGIN CERTIFICATE-----
MIICqjCCAhOgAwIBAgIUAOsXW5KDRNvBDTLaIreadCJVnn4wDQYJKoZIhvcNAQEL
...
-----END CERTIFICATE-----
# ca.key
xqq@VM-0-4-ubuntu:~/web/ssl$ cat ca.key
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCxImyGkSj2rB7zSNSM/2h4dg5tpJNGwJDQLE/PNKQtkorMgrbI
...
-----END RSA PRIVATE KEY-----
xqq@VM-0-4-ubuntu:~/web/ssl$
擴展名並不影響密鑰文件的內容