个人记录,仅供参考
事先说明
- 本文仅为本人操作过程,仅供参考。
-config
参数指定配置文件路径,例如openssl req -new -x509 -key ca.key -out ca.pem -days 1 -config openssl.cnf
,在本文操作中,均使用默认配置文件,通常来讲一台服务器上只做一个CA中心则无需另外创建专用的配置文件。默认引用的配置文件位置:/usr/lib/ssl/openssl.cnf
,链接到实际文件/etc/ssl/openssl.cnf
。
环境准备
OS: Ubuntu 20.04 LTS
执行apt update&&apt install openssl
安装OpenSSL。
原理
看参考资料第一条:自建 CA 中心并签发 CA 证书。
创建根证书
- 首先
净手焚香,新建一个目录,再在里面再创建一个文件夹,例如MyCA
。 - 下载 openssl.cnf 文件(正确的做法是从
/etc/pki/tls/openssl.cnf
复制到当前工作目录,但是在 Ubuntu 软件库里面安装的 openssl 大概率是没有的,只有从源码编译的版本才会有)。1
2
3
4# 官方 Github 库 RAW
curl -O https://raw.githubusercontent.com/openssl/openssl/master/apps/openssl.cnf
# 本站 CDN 源,抓取日期是2022年2月5日
curl -O https://flow.lxnchan.cn/files/openssl/openssl.cnf - 简单处理一下
cnf
文件。一般只需要改一下1
2
3
4
5
6
7
8
9
10
11[ CA_default ]
dir = /root/Workspace/MyCA
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.
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 CRLdir
项,改成MyCA
文件夹就行了。 - 搭建 CA 中心目录结构
1
2
3
4
5
6cd MyCA
mkdir newcerts private # newcerts dir:存放 CA 签署(颁发)过的数字证书
chmod 700 private # private dir:存放 CA 的私钥
touch index.txt # index.txt file:存放证书信息
echo 01 > serial - 生成 CA 证书的 RSA 私钥
1
openssl genrsa -passout pass:[Password] -aes256 -out /root/Workspace/MyCA/private/cakey.pem 2048
生成 CA 的根证书(公钥)
pass:
参数后输入密码;-key
字段填写上述生成的RSA私钥地址;-days
字段为证书有效期,单位为天;-subj
参数下证书主题字段定义参考证书主题(Subject)中字段的含义
节;-out
参数为输出位置。
下述指令一并完成了 CA 证书签名请求和对证书进行自签名两件事情。
1
openssl req -x509 -passin pass:[Password] -new -nodes -key /root/Workspace/MyCA/private/cakey.pem -days 3650 -subj "/C=CN/O=Organization/CN=My Org" -out Root_CA.pem
把上面的
Root_CA.pem
复制出来到Windows上,改一下后缀名改成crt
就可以双击安装。具体安装方法参考下述给客户端安装根证书
节。
生成服务端证书
- 创建证书请求
1
2
3
4
5
6
7
8# 切换到新证书目录并新建文件夹用于存储证书相关文件。
cd newcerts
mkdir foo
cd foo
# 生成 RSA 密钥
(umask 077; openssl genrsa -out foo.key 2048 )
# 生成证书颁发请求
openssl req -new -key foo.key -out foo.csr - 创建附加用途
新建ext
文件(例如foo.ext
),该文件上半部分基本不需要修改。1
2
3
4
5
6
7
8
9
10
11keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth, clientAuth
subjectAltName=@SubjectAlternativeName
[ SubjectAlternativeName ]
IP.1=10.5.66.233
IP.2=10.5.66.114
IP.3=10.5.67.1
DNS.1=office-server.myorg.org
DNS.2=oa-auth.intranet.myorg.org
DNS.3=oa-teams.intranet.myorg.org[ SubjectAlternativeName ]
段下面填入“证书通用名称”(备用名称),即除了主要名称外其他的名称。1
2
3
4
5
6
7extendedKeyUsage 可以指定证书目的,即用途,一般有:
serverAuth:保证远程计算机的身份
clientAuth:向远程计算机证明你的身份
codeSigning:确保软件来自软件发布者,保护软件在发行后不被更改
emailProtection:保护电子邮件消息
timeStamping:允许用当前时间签名数据
如果不指定,则默认为 所有应用程序策略 在 CA 签发该证书
-in
参数为证书颁发请求位置;-CA
CA 公钥位置;-CAkey
CA 私钥位置;-out
已签发过的证书输出位置;-days
证书有效期天数,目前 CA 一般都不会颁发超过一年的证书;-extfile
输入EXT文件。
证书签发:
1
2
3
4openssl x509 -req -in foo.csr \
-CA /root/Workspace/MyCA/Root_CA.pem \
-CAkey /root/Workspace/MyCA/private/cakey.pem -CAcreateserial \
-out foo.crt -days 365 -sha256 -extfile foo.ext签发完了之后证书目录就可以拿去用了。
客户端安装根证书
Windows
基于 Windows 10 Pro 21H2 19044.1586 测试
双击下crt证书文件,点击安装证书
,存储位置选择本地计算机
,再下一个页面中,选择将所有的证书放入下列存储
,在文本框右侧点击选择
,选择受信任的根证书颁发机构
,确定并点击下一步,点击完成
后出现导入成功
完成安装。
macOS
基于 macOS Big Sur 11.5.2 测试
- 首先在
启动台
中搜索钥匙串访问
,点击左侧系统
,然后将证书拖到右侧的空白区域,此时输入该Mac的账号和密码完成导入。 - 双击该项目,在新弹出的窗口中点击
信任
,将使用此证书时
的值改为始终信任
,然后关闭该窗口,此时输入该Mac的账号和密码完成信任。 - 当该证书下方显示
此证书已标记为受所有用户信任
时,安装完成。
Linux
基于 Ubuntu 20.04 LTS Desktop 测试
1 | # 复制到固定目录 |
显示1 added
和done
字样即为添加完成。
Firefox Browser
基于 Firefox For Ubuntu 96.0 测试
由于火狐浏览器采用自己的根证书列表而非系统提供,因此如果生产环境中有使用Firefox还需要在Firefox中再导入一遍。操作方式为首先复制Public.pem
到其他文件夹,改后缀名为crt
,然后打开Firefox,打开about:preferences#privacy
,下滑选择查看证书
,在新打开的对话框中选择“证书颁发机构”,点击下方“导入”,选择上述crt文件,在下一个对话框中勾选两个选项后确定即可。
iOS
基于iOS 12.5.1
在Safari上点击下载证书文件*.crt
,然后在弹出的对话中选择允许
,打开设置
,通用
,描述文件
,在已下载的描述文件
中选择刚才下载的证书,右上角点击安装
,随后输入设备密码,在接下来的警告页面中选择两次安装
,随后界面上显示绿色字体已验证
即为安装成功。
然后返回到通用
,选择关于本机
,下拉至底证书信任设置
,将刚才安装好的证书后面的开关打开即可。
Android
在设置中找到“从存储设备安装证书”,然后选择下载的根证书即可。Android 7 以上应用程序不再信任用户自定义根证书(仅Chrome/Webkit系浏览器信任),Android 11 可以在信任凭据区域选择“安装 CA 证书”。
证书主题(Subject)中字段的含义
字段简称 | 字段名 | 值说明 |
---|---|---|
CN | 公用名称 (Common Name) | 对于 SSL 证书,一般为网站域名; 而对于代码签名证书则为申请单位名称; 而对于客户端证书则为证书申请者的姓名 |
O | 单位名称 (Organization Name) | 单位名称 |
C | 国家 (Country) | 两位英文大写字母国家代码, 比如中国CN、日本JP、美国US、韩国KR |
L | 城市 | 所有者所在城市 |
S | 省份 | 所有者所在省份 |
E | 电子邮件 (E-Mail) | 所有者的电子邮件 |
OU | 组织单位 | — |
证书格式
PKCS 全称是 Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准,PKCS 目前共发布过 15 个标准。 常用的有:
- PKCS#7 Cryptographic Message Syntax Standard
- PKCS#10 Certification Request Standard
- PKCS#12 Personal Information Exchange Syntax Standard
- X.509是常见通用的证书格式。所有的证书都符合为Public Key Infrastructure (PKI) 制定的 ITU-T X509 国际标准。
- PKCS#7 常用的后缀是: .P7B .P7C .SPC
- X.509 DER 编码(ASCII)的后缀是: .DER .CER .CRT
- X.509 PAM 编码(Base64)的后缀是: .PEM .CER .CRT
- .cer/.crt是用于存放证书,它是2进制形式存放的,不含私钥。
- .pem跟crt/cer的区别是它以Ascii来表示。
- pfx/p12用于存放个人证书/私钥,他通常包含保护密码,2进制方式
- p7b以树状展示证书链(certificate chain),同时也支持单个证书,不含私钥。
cer格式转P7X(IIS)
用于微软的相关服务导入,会需要输入一个密码,该密码负责加密证书本身以确保该证书安全,在Windows Server上导入时输入该密码即可。
1 | openssl pkcs12 -export -in foo.cer -inkey foo.key -out foo.pfx |
证书吊销和吊销列表
吊销证书
执行如下命令吊销证书,如有报错请检查默认配置文件是否正确,吊销时需要输入CA证书的加密密码。
1 | openssl ca -revoke server.crt |
生成吊销列表
执行如下命令生成吊销列表(CRL),如有报错请检查配置文件和crlnumber
文件,生成吊销列表时需要输入CA证书的加密密码。
1 | openssl ca -gencrl -out server.crl |
证书附加用途和示例场景
- 根证书
密钥用法:认可签名,证书签名,CRL签名1
keyUsage=nonRepudiation, keyCertSign,cRLSign
- 代码签名
密钥用法:数字签名
增强密钥用法:代码签名1
2keyUsage=digitalSignature
extendedKeyUsage=codeSigning - 计算机
密钥用法:数字签名,密钥协商
增强密钥用法:服务器验证,客户端验证1
2keyUsage=digitalSignature,keyAgreement
extendedKeyUsage=serverAuth,clientAuth - WEB服务器
密钥用法:数字签名,认可签名,密钥加密,数据加密,密钥协商
增强密钥用法:服务器验证1
2keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment,keyAgreement
extendedKeyUsage=serverAuth - 客户端
密钥用法:数字签名,认可签名,密钥加密,数据加密
增强密钥用法:客户端验证1
2keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
extendedKeyUsage=clientAuth - 信任列表签名
密钥用法:数字签名
增强密钥用法:信任列表签名1
2keyUsage=digitalSignature
extendedKeyUsage=msCTLSign - 时间戳
密钥用法:数字签名,认可签名,密钥加密,数据加密
增强密钥用法:时间戳1
2keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
extendedKeyUsage=timeStamping - IPSEC
密钥用法:数字签名,认可签名,密钥加密,数据加密
增强密钥用法:IP安全IKE中级1
2keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
extendedKeyUsage=1.3.6.1.5.5.8.2.2 - 安全Email
密钥用法:数字签名,认可签名,密钥加密,数据加密
增强密钥用法:安全电子邮件1
2keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
extendedKeyUsage=emailProtection - 智能卡登陆
密钥用法:数字签名,密钥协商,仅仅解密
增强密钥用法:密钥恢复,加密文件系统,智能卡登陆1
2keyUsage=digitalSignature,keyAgreement,decipherOnly
extendedKeyUsage=1.3.6.1.4.1.311.10.3.11,msEFS,1.3.6.1.4.1.311.20.2.2
参考资料
排名不分先后