示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 生成 CA 私钥
openssl genrsa -out ca.key 2048

# 生成 CA 证书 ("YOURNAME" 处填上你自己的名字)
openssl req -x509 -new -nodes -key ca.key -sha256 -days 1825 -out ca.crt -subj "/C=CN/CN=UnblockNeteaseMusic Root CA/O=YOURNAME"

# 生成服务器私钥
openssl genrsa -out server.key 2048

# 生成证书签发请求
openssl req -new -sha256 -key server.key -out server.csr -subj "/C=CN/L=Hangzhou/O=NetEase (Hangzhou) Network Co., Ltd/OU=IT Dept./CN=*.music.163.com"

# 使用 CA 签发服务器证书
openssl x509 -req -extfile <(printf "extendedKeyUsage=serverAuth\nsubjectAltName=DNS:music.163.com,DNS:*.music.163.com") -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

  1. 生成私钥
    openssl genrsa -out mydomain.com.key 2048

  2. 检查私钥
    openssl rsa -in mydomain.com.key -noout -text

  3. 生成CSR,注意Common Name指向服务器地址或域名,有互动、命令行和配置文件三种方式来生成

    1. 互动方式,openssl要求填入一下信息用于生成CSR
      openssl req -new -key mydomain.com.key -out mydomain.com.csr
    2. 命令行,直接填入信息生成CSR
      openssl req -new -sha256 -key mydomain.com.key -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=mydomain.com" -out mydomain.com.csr
    3. 配置文件
      openssl req -new -out mydomain.com.csr -config oats.conf
  4. 检验CSR,可选项
    openssl req -in mydomain.com.csr -noout -text

  5. 由根证书签发用户证书
    openssl x509 -req -in mydomain.com.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out mydomain.com.crt -days 500 -sha256

  6. 检验用户证书,可选项
    openssl x509 -in mydomain.com.crt -text -noout

    1
    一步到位:openssl req -x509 -nodes -newkey rsa:2048 -keyout key-name.pem -out pem-name.pem -days 365

第一种方式

通过openssl生成私钥

1
openssl genrsa -out server.key 1024

使用私钥生成自签名的cert证书文件,以下是通过参数只定证书需要的信息

1
openssl req -new -x509 -days 3650 -key server.key -out server.crt -subj "/C=CN/ST=mykey/L=mykey/O=mykey/OU=mykey/CN=domain1/CN=domain2/CN=domain3"
1
2
3
4
5
6
openssl req -new -x509 -days 3650 \
-key server.key \
-out server.crt \
-subj "/C=CN/ST=Guangdong/L=Guangzhou Huangpu District/O=Self-signed Certificate/OU=Private Use/CN=yukifuhane.cn.eu.org" \
-addext "subjectAltName = DNS:yukifuhane.cn.eu.org, DNS:192.168.6.3, IP:192.168.6.3"
#-subj "/C=CN/ST=Guangdong/L=Guangzhou Huangpu District/O=Self-signed Certificate/OU=Private Use/CN=192.168.6.3" \
  • 一般的数字证书产品的主题通常含有如下字段:
1
2
3
字段名	字段值
公用名称 (Common Name) 简称:CN 字段,对于 SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端证书则为证书申请者的姓名;
单位名称 (Organization Name) 简称:O 字段,对于 SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端单位证书则为证书申请者所在单位名称;
  • 证书申请单位所在地
1
2
3
所在城市 (Locality)| 简称:L 字段 
所在省份 (State/Provice)| 简称:S 字段
所在国家 (Country)| 简称:C 字段,只能是国家字母缩写,如中国:CN
  • 其他一些字段
1
2
3
4
5
6
7
电子邮件 (Email)| 简称:E 字段 
多个姓名字段 | 简称:G 字段
介绍 | Description 字段
电话号码:|Phone 字段,格式要求 + 国家区号 城市区号 电话号码,如: +86 732 88888888
地址:|STREET 字段
邮政编码: |PostalCode 字段
显示其他内容| 简称:OU 字段

如果对上面参数具体的说明不太了解的,可以使用不带参数的方式,通过命令行步骤生成,参考第二种方式。

第二种方式

通过openssl生成私钥

1
openssl genrsa -out server.key 1024

根据私钥生成证书申请文件csr

1
openssl req -new -key server.key -out server.csr

这里根据命令行向导来进行信息输入:

img

ps.Common Name可以输入:*.yourdomain.com,这种方式生成通配符域名证书

使用私钥对证书申请进行签名从而生成证书

1
openssl x509 -req -in server.csr -out server.crt -signkey server.key -days 3650

这样就生成了有效期为:10年的证书文件,对于自己内网服务使用足够。

第三种方式

直接生成证书文件

1
openssl req -new -x509 -keyout server.key -out server.crt -config openssl.cnf

ps.以上生成得到的server.crt证书,格式都是pem的。


证书的作用

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加密保存:

1
openssl genrsa -aes128 -out ca.key 2048

2.生成公钥

1
openssl rsa -in ca.key -pubout -out ca-public.key

3.生成CA的自签名证书ca.crt,此处的CA证书也是一个自签名证书

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 []:

以下命令可以不用在调用密钥文件的时候输入密码:

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

查看自签名证书信息(颁发者):

1
2
3
4
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)文件

1
openssl genrsa -aes128 -out server.key 2048 

2.利用私钥server.key文件生成自签名证书请求文件server.csr

生成csr文件时,需要填写一些关于待签人或者公司的一些信息,比如国家明,省份名,组织机构名,主机名,email名,有些信息可以不填写,使用.标识。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

1
2
3
4
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

查看自签名证书的过期时间:

1
openssl x509 -in server.crt -subject -issuer -noout

openssl生成root CA及签发证书

有时,使用SSL协议是自己内部服务器使用的,这时可以不必找第三方权威的CA机构做证书,可以做自签证书(自己创建root CA(非权威)。
主要有以下三个步骤:
A.创建openssl.cnf在使用default-ca时需要使用的SSL的工作目录(第一次必须要设置)

1.查看openssl的配置文件

1
2
3
4
5
6
7
8
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 ]节点默认值,创建对应文件夹和文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[ 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下执行以下命令创建文件夹和文件:

1
2
3
4
5
6
mkdir certs(默认应该是存在的)存放已颁发的证书
mkdir newcerts(默认应该是存在的)存放CA指令生成的新证书
mkdir private(默认应该是存在的)存放私钥
mkdir crl(默认应该是存在的)存放已吊销的证书
touch index.txt openssl定义的已签发证书的文本数据库文件,这个文件通常在初始化的时候是空的
echo 01>serial 证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行存放的,该文件必须提供并包含一个有效序列号

执行完成后,当前目录为:

1
2
3
4
5
6
7
8
[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
2
3
4
5
6
7
8
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
2
3
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:

1
2
3
4
5
6
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:

1
2
3
4
5
6
7
8
9
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:

1
https://YOUR_DOMAINNAME_HERE

RSA是非对称加密,需要用两个密钥来加密和解密,这两个密钥是公钥和私钥