标签 CA 下的文章

一家神秘公司掌握着一个主流 SSL 根证书机构

据报道,Chrome、Safari、Firefox 和其他浏览器都接受一家名为 TrustCor 的根证书机构(CA)。CA 是互联网基础设施的基石,它签署的 SSL 证书可以保证网站不是假的,流量是加密的。因而,CA 可以签发“伪造”证书从而劫持加密流量。此外,该公司在巴拿马的注册记录显示,其信息与今年被确认的一家的间谍软件制造商相同,文件显示,该公司十多年来一直向美国政府机构出售通信拦截服务。Mozilla 表示它可能会取消 TrustCor 的根证书。

消息来源:华盛顿邮报
老王点评:谷歌当年就因为有根 CA 滥用而取消过该根 CA 证书,看看这次谷歌会如何?

GitHub 实验 “Hey, GitHub!” 语音编程

GitHub Next 团队宣布了一项新的实验:“Hey, GitHub!”,允许与 Copilot 进行语音互动。也就是说,你甚至不需要使用键盘就可以让 VSCode 为你提供编程建议。GitHub 称,该实验可以识别“自然语言”。除了编写和编辑代码,它还允许程序员进行代码导航和执行其它 VSCode 命令。

消息来源:The Verge
老王点评:连键盘都不用了,直接讲你要干啥就好了。

美国国家安全局敦促各组织转向内存安全编程语言

美国国家安全局(NSA)表示,建议各组织通过利用 C#、Go、Java、Ruby 或 Swift 等语言内存安全编程语言进行战略性转变。NSA 表示“内存管理问题已经被利用了几十年,今天仍然很常见。”软件内存安全问题是约 70% 的漏洞背后的原因。不良的内存管理也会导致技术问题,如不正确的程序结果,随着时间的推移程序性能的下降,以及程序崩溃。

消息来源:NSA
老王点评:建议是好的,但是 NSA 不太值得信任。

苹果强势逼迫整个 CA 行业进入一年的证书寿命期

苹果公司在 2020 年 2 月单方面做出的一项决定,并有效地强势逼迫证书颁发机构行业接受 TLS 证书 398 天的新默认寿命。苹果打破了 CA/B 论坛的标准操作程序,没有要求投票,而是简单地宣布决定在其设备上实施 398 天的寿命。继苹果最初宣布之后,Mozilla 和谷歌也表示了类似的意向,将在其浏览器中实施同样的规则。从 2020 年 9 月 1 日开始,苹果、谷歌和 Mozilla 的浏览器和设备将对有效期超过 398 天的新 TLS 证书显示错误。TLS 证书的寿命从 8 年开始,经过多年的发展,浏览器厂商对其进行了削足适履,将其降低到 5 年,然后是 3 年,再到2年。上一次变化发生在 2018 年 3 月,当时浏览器制造商试图将 SSL 证书寿命从三年减少到一年,但在 CA 的积极反击下妥协了两年。简单点说,就是表明浏览器厂商控制了 CA/B 论坛,他们完全控制了 HTTPS 生态系统,而 CA 只是参与者,没有实际权力。

来源:cnBeta.COM

拍一拍:这个世界果然是谁的拳头大谁说了算。

部分开源项目着手支持 macOS ARM64

虽然首批搭载苹果 64 位 ARM 芯片的 MacBook/Mac 最快也要到年底才会面向消费者提供,并且在这之前苹果只向开发者提供数量有限的开发机,但部分开源项目已经在为 64 位 ARM Mac 的构建做必要的构建系统更改和其他准备工作。苹果已经开始将 ARM / macOS 11 的部分变化提交给上游 LLVM/Clang,他们也合并了苹果的提交。LibreOffice 是已经在为支持面向 macOS ARM64 构建而做准备的知名开源项目之一,另一个例子是苹果一直在进行的对 OpenJDK 的修改。

来源:开源中国

拍一拍:我好奇的一点是,对 LibreOffice 这样的开源项目来说,macOS 上的用户有多少?与其在这个方面下功夫,还不如在产品性能和功能上投入更多精力吧。

AWS 正式推出基于 AI 的 CodeGuru 代码检查与性能分析器

作为一款借助机器学习技术来自动检查代码错误、并提出潜在优化建议的工具,其现已正式向公众开放。据悉,CodeGuru 主要由代码检查其 Reviewer 和性能分析器 Profiler 两个部分组成。据悉,为了打造代码分析器,AWS 团队借鉴了 GitHub 上超过一万个开源项目的代码、以及亚马逊内部代码库来训练其算法。

来源:cnBeta.COM

拍一拍:看来以后写了烂代码也不怕了,有 AI 可以帮你检查甚至提供建议。

为你的微服务架构或者集成测试创建一个简单的内部 CA。

传输层安全(TLS)模型(有时也称它的旧名称 SSL)基于 证书颁发机构 certificate authoritie (CA)的概念。这些机构受到浏览器和操作系统的信任,从而签名服务器的的证书以用于验证其所有权。

但是,对于内部网络,微服务架构或集成测试,有时候本地 CA更有用:一个只在内部受信任的 CA,然后签名本地服务器的证书。

这对集成测试特别有意义。获取证书可能会带来负担,因为这会占用服务器几分钟。但是在代码中使用“忽略证书”可能会被引入到生产环境,从而导致安全灾难。

CA 证书与常规服务器证书没有太大区别。重要的是它被本地代码信任。例如,在 Python requests 库中,可以通过将 REQUESTS_CA_BUNDLE 变量设置为包含此证书的目录来完成。

在为集成测试创建证书的例子中,不需要长期的证书:如果你的集成测试需要超过一天,那么你应该已经测试失败了。

因此,计算昨天明天作为有效期间隔:

>>> import datetime
>>> one_day = datetime.timedelta(days=1)
>>> today = datetime.date.today()
>>> yesterday = today - one_day
>>> tomorrow = today - one_day

现在你已准备好创建一个简单的 CA 证书。你需要生成私钥,创建公钥,设置 CA 的“参数”,然后自签名证书:CA 证书总是自签名的。最后,导出证书文件以及私钥文件。

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes, serialization
from cryptography import x509
from cryptography.x509.oid import NameOID


private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()
builder = x509.CertificateBuilder()
builder = builder.subject_name(x509.Name([
    x509.NameAttribute(NameOID.COMMON_NAME, 'Simple Test CA'),
]))
builder = builder.issuer_name(x509.Name([
    x509.NameAttribute(NameOID.COMMON_NAME, 'Simple Test CA'),
]))
builder = builder.not_valid_before(yesterday)
builder = builder.not_valid_after(tomorrow)
builder = builder.serial_number(x509.random_serial_number())
builder = builder.public_key(public_key)
builder = builder.add_extension(
    x509.BasicConstraints(ca=True, path_length=None),
    critical=True)
certificate = builder.sign(
    private_key=private_key, algorithm=hashes.SHA256(),
    backend=default_backend()
)
private_bytes = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncrption())
public_bytes = certificate.public_bytes(
    encoding=serialization.Encoding.PEM)
with open("ca.pem", "wb") as fout:
    fout.write(private_bytes + public_bytes)
with open("ca.crt", "wb") as fout:
    fout.write(public_bytes)

通常,真正的 CA 会需要证书签名请求(CSR)来签名证书。但是,当你是自己的 CA 时,你可以制定自己的规则!可以径直签名你想要的内容。

继续集成测试的例子,你可以创建私钥并立即签名相应的公钥。注意 COMMON_NAME 需要是 https URL 中的“服务器名称”。如果你已配置名称查询,你需要服务器能响应对 service.test.local 的请求。

service_private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
service_public_key = service_private_key.public_key()
builder = x509.CertificateBuilder()
builder = builder.subject_name(x509.Name([
   x509.NameAttribute(NameOID.COMMON_NAME, 'service.test.local')
]))
builder = builder.not_valid_before(yesterday)
builder = builder.not_valid_after(tomorrow)
builder = builder.public_key(public_key)
certificate = builder.sign(
    private_key=private_key, algorithm=hashes.SHA256(),
    backend=default_backend()
)
private_bytes = service_private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.TraditionalOpenSSL,
    encryption_algorithm=serialization.NoEncrption())
public_bytes = certificate.public_bytes(
    encoding=serialization.Encoding.PEM)
with open("service.pem", "wb") as fout:
    fout.write(private_bytes + public_bytes)

现在 service.pem 文件有一个私钥和一个“有效”的证书:它已由本地的 CA 签名。该文件的格式可以给 Nginx、HAProxy 或大多数其他 HTTPS 服务器使用。

通过将此逻辑用在测试脚本中,只要客户端配置信任该 CA,那么就可以轻松创建看起来真实的 HTTPS 服务器。


via: https://opensource.com/article/19/4/certificate-authority

作者:Moshe Zadka 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

最近关于沃通和 StartCom 这两家 CA 公司的消息让人们再次关注到了网络隐私和安全的问题。随着 Mozilla苹果谷歌对这两家 CA 公司处罚落定,很多使用这两家 CA 所签发证书的网站纷纷寻求新的证书签发商。这里面固然有不少可信赖的 CA 公司可以提供服务,不过,有另外一个非盈利组织却为大家提供了免费、可靠和安全的 SSL 证书服务,这就是 Let's Encrypt 项目。

Let's Encrypt 项目是由 互联网安全研究小组 ISRG,Internet Security Research Group 主导并开发的一个新型 数字证书认证机构 CA,Certificate Authority 。该项目旨在开发一个自由且开放的自动化 CA 套件,并向公众提供相关的证书免费签发服务以降低安全通讯的财务、技术和教育成本。

网站的完全加密是非常有必要的,这样每个人都可以随意在网上畅游而不用担心他们的活动被监视、拦截和修改。

Let’s Encrypt 的做法与一般的 CA 服务商不同。他们为那些需要加密的网站提供了免费、易用的获取和管理证书的服务,而且在全球的每一个国家都可以使用。这些服务可以帮助人们或组织战胜来自经济、技术和培训方面的障碍,在互联网上安全地通讯。

仅仅在 Let’s Encrypt 运营了 10 个月之后,加密的页面数量就有了快速提升!这里面,Let’s Encrypt 项目居功甚伟,采用加密 Let’s Encrypt 的页面 90% 都是之前从未进行过加密的。

然而,互联网上还有超过一半的页面仍然没有加密。所以 Let’s Encrypt 还任重而道远,为了达成让互联网全都变成加密的这一目标,他们需要你的帮助!因此 Let’s Encrypt 在众筹网站 generosity.com 上发起了众筹,募集更多的运营资金,以期做的更好!

如果您能捐助他们,您就为建立一个更安全的互联网埋下了一块基石。您所捐赠的每一块钱,都可以帮助 Let’s Encrypt 为所有用户创建一个尊重隐私的互联网体验。

他们划定了几个从 $25 到 $42000 不等的捐赠级别,并且为了感谢您的支持,会提供给您一些有趣的礼品以示谢意:

第一个级别 $25,您将收到一声感谢!

第二个级别 $50,您将收到一些精美的贴纸,可以贴在你的保险杠、水杯或者其它的什么地方。

第三个级别是 $100,他们叫这个“To Encryption and Beyond!”,礼品是这些漂亮的、合身的 T恤。

如果您捐赠了 $250,您将同时收到 T 恤和贴纸。

更高额度的捐赠就不在这里一一列出了,富有爱心的土豪可以移步这个众筹网站去看看。

如果您暂时手头比较紧张,你还有其它的几种方式支持:

  • 分享这篇文章或其中的视频到你常用的社交媒体中。
  • 转发这个的捐赠计划。
  • 参与他们的社区论坛。
  • 帮助他们找到 bug 以便可以修复它。

关于 Let's Encrypt 的更多信息,您可以访问其官网: https://letsencrypt.org/ ;如何使用他们的服务,你可以参考这篇文章

Firefox 浏览器背后的 Mozilla 基金会正在考虑对沃通(WoSign)及被其秘密收购的 StartCom(著名的 StartSSL 即其旗下产品)这两个 CA 一年内新签发的所有 SSL 证书进行封杀。

Mozilla 的工程师是在对这两个 CA 签发了一系列可疑的 SSL SHA-1 证书进行调查之后,宣布了这个禁令。

这两家 CA 试图规避 SHA-1 停用政策

该问题主要是因为各大主要浏览器厂商共同决定从 2016 年 1 月 1 日开始就停止接受采用陈旧的 SHA-1 签名算法的证书。而 Mozilla 指责沃通今年还在签发 SHA-1 签名的证书,并将签发日期倒填成去年 12 月份。

虽然 Mozilla 也允许一些其它的 CA 在 2016 年 1 月 1 日之后继续签发 SHA-1 证书,比如说赛门铁克,但是他们仅允许那些通过了复杂的审批流程的 CA 这样做,而显然沃通没有得到同意。

沃通秘密收购了 StartCom

此外,沃通似乎在否认其收购了以色列 CA 公司 StartCom。Mozilla 说,沃通已经于 2015 年 11 月 1 日百分百地收购了 StartCom。而另一方面,据奇虎 360 称,它共计持有 84% 的沃通股份。但是这些信息沃通此前都予以否认或拒绝发表意见。

此外,在 Mozilla 披露的技术细节中显示,StartCom 已经开始使用沃通的基础架构来签发新的证书了。而且,StartCom 也和沃通一样在 2016 年采用了倒填日期的手段来签发 SHA-1 证书。Mozilla 的安全工程师也展示了这种违例的案例细节。

Mozilla 的调查发现,一个和 GeoTrust CA 合作了多年的付费处理机构 Tyro 突然在 6 月中旬使用 StartCom 部署了一个 SHA-1 签名的证书,而此前该机构从未和 StartCom 有过合作。该证书看起来是在 2015 年 12 月 20 日签发的,而在同一个日期 StartCom 签发大量的 SHA-1 证书。Mozlla 发现这些证书部署于 2016 年中,这很不正常,这显然是采用倒填日期来规避 SHA-1 停用的策略。

这些问题以及其它的更多问题让 Mozilla 决定在至少一年内不再信任沃通和 StartCom 的 SSL 证书。

或许会永久封杀

Mozilla 说这个临时封杀仅针对这两个公司最新签发的证书,不影响已经分发给他们的客户的证书。如果这两个公司在一年的封杀后没有通过一系列的检查,Mozilla 将准备封杀这两个公司的所有证书。

“许多人都在盯着 Web PKI 安全体系,如果发现了这样的倒填(不管是什么原因),Mozilla 会立即永久地取消对沃通和 StartCom 根证书的信任。”该报告中说。

此外,Chrome 和其它产品的对它们的封杀也在计划中。“其它的浏览器厂商和根证书存储运营者也会做出他们自己的决定,我们在这个文档中摆出了这些信息,以便他们了解我们做出这个决定的原因,并可以据此做出他们的决定。”Mozilla 说。

这是一篇快速指南,使用 OpenSSL 来生成 CA ( 证书授权中心 certificate authority )、 中级 CA intermediate CA 末端证书 end certificate 。包括 OCSP、CRL 和 CA 颁发者 Issuer 信息、具体颁发和失效日期。

我们将设置我们自己的 根 CA root CA ,然后使用根 CA 生成一个示例的中级 CA,并使用中级 CA 签发最终用户证书。

根 CA

为根 CA 创建一个目录,并进入:

mkdir -p ~/SSLCA/root/
cd ~/SSLCA/root/

生成根 CA 的 8192 位长的 RSA 密钥:

openssl genrsa -out rootca.key 8192

输出类似如下:

Generating RSA private key, 8192 bit long modulus
.........++
....................................................................................................................++
e is 65537 (0x10001)

如果你要用密码保护这个密钥,在命令行添加选项 -aes256

创建 SHA-256 自签名的根 CA 证书 ca.crt;你需要为你的根 CA 提供识别信息:

openssl req -sha256 -new -x509 -days 1826 -key rootca.key -out rootca.crt

输出类似如下:

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]:Beijing
Locality Name (eg, city) []:Chaoyang dist.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Linux.CN
Organizational Unit Name (eg, section) []:Linux.CN CA
Common Name (e.g. server FQDN or YOUR name) []:Linux.CN Root CA
Email Address []:[email protected]

创建几个文件, 用于该 CA 存储其序列号:

touch certindex
echo 1000 > certserial
echo 1000 > crlnumber

创建 CA 的配置文件,该文件包含 CRL 和 OCSP 终端的存根。

# vim ca.conf
[ ca ]
default_ca = myca

[ crl_ext ]
issuerAltName=issuer:copy 
authorityKeyIdentifier=keyid:always

[ myca ]
dir = ./
new_certs_dir = $dir
unique_subject = no
certificate = $dir/rootca.crt
database = $dir/certindex
private_key = $dir/rootca.key
serial = $dir/certserial
default_days = 730
default_md = sha1
policy = myca_policy
x509_extensions = myca_extensions
crlnumber = $dir/crlnumber
default_crl_days = 730

[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = optional
emailAddress = optional
organizationName = supplied
organizationalUnitName = optional

[ myca_extensions ]
basicConstraints = critical,CA:TRUE
keyUsage = critical,any
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
extendedKeyUsage = serverAuth
crlDistributionPoints = @crl_section
subjectAltName  = @alt_names
authorityInfoAccess = @ocsp_section

[ v3_ca ]
basicConstraints = critical,CA:TRUE,pathlen:0
keyUsage = critical,any
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = digitalSignature,keyEncipherment,cRLSign,keyCertSign
extendedKeyUsage = serverAuth
crlDistributionPoints = @crl_section
subjectAltName  = @alt_names
authorityInfoAccess = @ocsp_section

[ alt_names ]
DNS.0 = Linux.CN Root CA
DNS.1 = Linux.CN CA Root
  
[crl_section]
URI.0 = http://pki.linux.cn/rootca.crl
URI.1 = http://pki2.linux.cn/rootca.crl

[ ocsp_section ]
caIssuers;URI.0 = http://pki.linux.cn/rootca.crt
caIssuers;URI.1 = http://pki2.linux.cn/rootca.crt
OCSP;URI.0 = http://pki.linux.cn/ocsp/
OCSP;URI.1 = http://pki2.linux.cn/ocsp/

如果你要设置一个特定的证书起止时间,添加下述内容到 [myca]

# format: YYYYMMDDHHMMSS
default_enddate = 20191222035911
default_startdate = 20181222035911

创建1号中级 CA

生成中级 CA 的私钥

openssl genrsa -out intermediate1.key 4096

生成其 CSR:

openssl req -new -sha256 -key intermediate1.key -out intermediate1.csr

输出类似如下:

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]:Beijing
Locality Name (eg, city) []:Chaoyang dist.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Linux.CN
Organizational Unit Name (eg, section) []:Linux.CN CA
Common Name (e.g. server FQDN or YOUR name) []:Linux.CN Intermediate CA
Email Address []:

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

请确保中级 CA 的主题名(CN,Common Name)和根 CA 的不同。

使用根 CA 为你创建的中级 CA 的 CSR 签名:

openssl ca -batch -config ca.conf -notext -in intermediate1.csr -out intermediate1.crt

输出类似如下:

Using configuration from ca.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'CN'
stateOrProvinceName   :ASN.1 12:'Beijing'
localityName          :ASN.1 12:'chaoyang dist.'
organizationName      :ASN.1 12:'Linux.CN'
organizationalUnitName:ASN.1 12:'Linux.CN CA'
commonName            :ASN.1 12:'Linux.CN Intermediate CA'
Certificate is to be certified until Mar 30 15:07:43 2017 GMT (730 days)

Write out database with 1 new entries
Data Base Updated

生成 CRL (包括 PEM 和 DER 两种格式):

openssl ca -config ca.conf -gencrl -keyfile rootca.key -cert rootca.crt -out rootca.crl.pem

openssl crl -inform PEM -in rootca.crl.pem -outform DER -out rootca.crl

每次使用该 CA 签名证书后都需要生成 CRL。

如果需要的话,你可以 撤销 revoke 这个中级证书:

openssl ca -config ca.conf -revoke intermediate1.crt -keyfile rootca.key -cert rootca.crt

配置1号中级 CA

给该中级 CA 创建新目录,并进入:

mkdir ~/SSLCA/intermediate1/
cd ~/SSLCA/intermediate1/

从根 CA 那边复制这个中级 CA 的证书和私钥:

cp ../root/intermediate1.key ./
cp ../root/intermediate1.crt ./

创建索引文件:

touch certindex
echo 1000 > certserial
echo 1000 > crlnumber

创建一个新的 ca.conf

# vim ca.conf

[ ca ]
default_ca = myca

[ crl_ext ]
issuerAltName=issuer:copy 
authorityKeyIdentifier=keyid:always

[ myca ]
dir = ./
new_certs_dir = $dir
unique_subject = no
certificate = $dir/intermediate1.crt
database = $dir/certindex
private_key = $dir/intermediate1.key
serial = $dir/certserial
default_days = 365
default_md = sha1
policy = myca_policy
x509_extensions = myca_extensions
crlnumber = $dir/crlnumber
default_crl_days = 365

[ myca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = optional
emailAddress = optional
organizationName = supplied
organizationalUnitName = optional

[ myca_extensions ]
basicConstraints = critical,CA:FALSE
keyUsage = critical,any
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
keyUsage = digitalSignature,keyEncipherment
extendedKeyUsage = serverAuth
crlDistributionPoints = @crl_section
subjectAltName  = @alt_names
authorityInfoAccess = @ocsp_section

[ alt_names ]
DNS.0 = Linux.CN Intermidiate CA 1
DNS.1 = Linux.CN CA Intermidiate 1

[ crl_section ]
URI.0 = http://pki.linux.cn/intermediate1.crl
URI.1 = http://pki2.linux.cn/intermediate1.crl

[ ocsp_section ]
caIssuers;URI.0 = http://pki.linux.cn/intermediate1.crt
caIssuers;URI.1 = http://pki2.linux.cn/intermediate1.crt
OCSP;URI.0 = http://pki.linux.cn/ocsp/
OCSP;URI.1 = http://pki2.linux.cn/ocsp/

修改 [alt_names] 小节为你所需的 替代主题名 Subject Alternative names 。如果不需要就删除引入它的 subjectAltName = @alt_names 行。

如果你需要指定起止时间,添加如下行到 [myca] 中。

# format: YYYYMMDDHHMMSS
default_enddate = 20191222035911
default_startdate = 20181222035911

生成一个空的 CRL (包括 PEM 和 DER 两种格式):

openssl ca -config ca.conf -gencrl -keyfile intermediate1.key -cert intermediate1.crt -out intermediate1.crl.pem

openssl crl -inform PEM -in intermediate1.crl.pem -outform DER -out intermediate1.crl

创建最终用户证书

我们使用新的中级 CA 来生成最终用户的证书。为每个你需要用此 CA 签名的最终用户证书重复这些步骤。

mkdir ~/enduser-certs
cd ~/enduser-certs

生成最终用户的私钥:

openssl genrsa -out enduser-example.com.key 4096

生成最终用户的 CSR:

openssl req -new -sha256 -key enduser-example.com.key -out enduser-example.com.csr

输出类似如下:

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]:Shanghai
Locality Name (eg, city) []:Xuhui dist.
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Inc
Organizational Unit Name (eg, section) []:IT Dept
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:

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

用1号中级 CA 签名最终用户的证书:

cd ~/SSLCA/intermediate1
openssl ca -batch -config ca.conf -notext -in ~/enduser-certs/enduser-example.com.csr -out ~/enduser-certs/enduser-example.com.crt

输出类似如下:

Using configuration from ca.conf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'CN'
stateOrProvinceName   :ASN.1 12:'Shanghai'
localityName          :ASN.1 12:'Xuhui dist.'
organizationName      :ASN.1 12:'Example Inc'
organizationalUnitName:ASN.1 12:'IT Dept'
commonName            :ASN.1 12:'example.com'
Certificate is to be certified until Mar 30 15:18:26 2016 GMT (365 days)

Write out database with 1 new entries
Data Base Updated

生成 CRL (包括 PEM 和 DER 两种格式):

cd ~/SSLCA/intermediate1/
openssl ca -config ca.conf -gencrl -keyfile intermediate1.key -cert intermediate1.crt -out intermediate1.crl.pem

openssl crl -inform PEM -in intermediate1.crl.pem -outform DER -out intermediate1.crl

每次使用该 CA 签名证书后都需要生成 CRL。

如果需要的话,你可以撤销revoke这个最终用户证书:

cd ~/SSLCA/intermediate1/  
openssl ca -config ca.conf -revoke ~/enduser-certs/enduser-example.com.crt -keyfile intermediate1.key -cert intermediate1.crt

输出类似如下:

Using configuration from ca.conf
Revoking Certificate 1000.
Data Base Updated

将根证书和中级证书连接起来创建证书链文件:

cat ../root/rootca.crt intermediate1.crt > ~/enduser-certs/enduser-example.com.chain

将这些文件发送给最终用户:

enduser-example.com.crt
enduser-example.com.key
enduser-example.com.chain

你也可以让最终用户提供他们中级的 CSR 文件,而只发回给他们 这个 .crt 文件。不要从服务器上删除它们,否则就不能撤销了。

校验证书

你可以通过如下命令使用证书链来验证最终用户证书:

cd ~/enduser-certs
openssl verify -CAfile enduser-example.com.chain enduser-example.com.crt 
enduser-example.com.crt: OK

你也可以用 CRL 来校验它。首先将 PEM CRL 连接到证书链文件:

cd ~/SSLCA/intermediate1
cat ../root/rootca.crt intermediate1.crt intermediate1.crl.pem > ~/enduser-certs/enduser-example.com.crl.chain

校验证书:

cd ~/enduser-certs
openssl verify -crl_check -CAfile enduser-example.com.crl.chain enduser-example.com.crt

如果该证书未撤销,输出如下:

enduser-example.com.crt: OK

如果撤销了,输出如下:

enduser-example.com.crt: CN = example.com, ST = Beijing, C = CN, O = Example Inc, OU = IT Dept
error 23 at 0 depth lookup:certificate revoked