个人记录,仅供参考
事先说明
本文仅为本人操作过程,仅供参考。
-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 | # 官方 Github 库 RAW |
- 简单处理一下
cnf
文件。
1 | [ CA_default ] |
一般只需要改一下dir
项,改成MyCA
文件夹就行了。
- 搭建 CA 中心目录结构
1 | cd MyCA |
- 生成 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 | # 切换到新证书目录并新建文件夹用于存储证书相关文件。 |
- 创建附加用途
新建ext
文件(例如foo.ext
),该文件上半部分基本不需要修改。
1 | keyUsage = nonRepudiation, digitalSignature, keyEncipherment |
[ SubjectAlternativeName ]
段下面填入“证书通用名称”(备用名称),即除了主要名称外其他的名称。
1 | extendedKeyUsage 可以指定证书目的,即用途,一般有: |
- 在 CA 签发该证书
-in
参数为证书颁发请求位置;-CA
CA 公钥位置;-CAkey
CA 私钥位置;-out
已签发过的证书输出位置;-days
证书有效期天数,目前 CA 一般都不会颁发超过一年的证书;-extfile
输入EXT文件。
1 | openssl 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 | keyUsage=digitalSignature |
- 计算机
密钥用法:数字签名,密钥协商
增强密钥用法:服务器验证,客户端验证
1 | keyUsage=digitalSignature,keyAgreement |
- WEB服务器
密钥用法:数字签名,认可签名,密钥加密,数据加密,密钥协商
增强密钥用法:服务器验证
1 | keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment,keyAgreement |
- 客户端
密钥用法:数字签名,认可签名,密钥加密,数据加密
增强密钥用法:客户端验证
1 | keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment |
- 信任列表签名
密钥用法:数字签名
增强密钥用法:信任列表签名
1 | keyUsage=digitalSignature |
- 时间戳
密钥用法:数字签名,认可签名,密钥加密,数据加密
增强密钥用法:时间戳
1 | keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment |
- IPSEC
密钥用法:数字签名,认可签名,密钥加密,数据加密
增强密钥用法:IP安全IKE中级
1 | keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment |
- 安全Email
密钥用法:数字签名,认可签名,密钥加密,数据加密
增强密钥用法:安全电子邮件
1 | keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment |
- 智能卡登陆
密钥用法:数字签名,密钥协商,仅仅解密
增强密钥用法:密钥恢复,加密文件系统,智能卡登陆
1 | keyUsage=digitalSignature,keyAgreement,decipherOnly |
参考资料
排名不分先后