OpenSSL 创建私有 CA 三部曲:
使用 OpenSSL 创建私有 CA:1 根证书
使用 OpenSSL 创建私有 CA:2 中间证书
使用 OpenSSL 创建私有 CA:3 用户证书

OpenSSL 是一个免费开源的库,它提供了一些处理数字证书的命令行工具。其中一些工具可以用作证书颁发机构(Certificate Authority 即 CA)。
证书颁发机构(CA)是签署数字证书的实体。许多网站需要让他们的客户知道连接是安全的,所以需要从一个被广泛信任的CA(例如VeriSign, DigiCert)来为他们的域名签署证书,也就是我们常说的 HTTPS 证书。
本系列文章的目的不是让你创建像 VeriSign 那样的 CA 机构。在很多情况下,我们需要在公司局域网内的网站中启用 HTTPS,比如测试环境,或者是公司内网中的管理系统(现在主流的浏览器都把 HTTP 站点标记为不安全)。此时通过 OpenSSL 创建私有 CA 并颁发证书就是很好的选择了。
本系列分为三篇文章,即本文《使用 OpenSSL 创建私有 CA:1 根证书》后续的《使用 OpenSSL 创建私有 CA:2 中间证书》和《使用 OpenSSL 创建私有 CA:3 用户证书》。
说明:本系列文章的演示环境为 Ubuntu 18.04,OpenSSL 的版本为 1.1.0g。

基本目录结构

创建 myca 目录保存 CA 相关的所有内容,然后创建 myca/rootca 目录用来保存根证书相关的内容:

至于上图中的 myca/powerca 和 myca/usercert 则存放后面要介绍的中间证书和用户证书的内容。

准备根证书的配置文件

OpenSSL 程序提供了一个默认的配置文件:/etc/ssl/openssl.cnf,但是由于我们自定义的内容比较多,所以干脆创建一个套单独的配置文件。创建文件 rootca/rootca.cnf,编辑其内容如下:

# OpenSSL root CA configuration file.
# v1
[ ca ]
# `man ca`
default_ca = CA_default
[ CA_default ]
# Directory and file locations.
dir = /home/nick/projects/myca/rootca
certs = $dir/certs
crl_dir = $dir/crl
new_certs_dir = $dir/newcerts
database = $dir/db/index
serial = $dir/db/serial
RANDFILE = $dir/private/random
# The root key and root certificate.
private_key = $dir/private/rootca.key.pem
certificate = $dir/certs/rootca.cert.pem
# For certificate revocation lists.
crlnumber = $dir/db/crlnumber
crl = $dir/crl/rootca.crl.pem
crl_extensions = crl_ext
default_crl_days =
# SHA- is deprecated, so use SHA- instead.
default_md = sha256
name_opt = ca_default
cert_opt = ca_default
default_days =
preserve = no
policy = policy_strict
[ policy_strict ]
# The root CA should only sign intermediate certificates that match.
# See the POLICY FORMAT section of `man ca`.
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
# Options for the `req` tool (`man req`).
# Optionally, specify some defaults.
prompt = no
input_password = default_bits =
distinguished_name = req_distinguished_name
string_mask = utf8only
# SHA- is deprecated, so use SHA- instead.
default_md = sha256
# Extension to add when the -x509 option is used.
# make sure use x509_extensions, do not use req_extensions.
x509_extensions = v3_ca
# use the req_extensions not work.
#req_extensions = v3_ca
[ req_distinguished_name ]
# See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
countryName = CN
stateOrProvinceName = ShaanXi
localityName = Xian
organizationName = NickLi Ltd
organizationalUnitName = NickLi Ltd CA
commonName = NickLi Root CA
emailAddress = ljfpower@
.com
[ v3_ca ]
# Extensions for a typical CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ crl_ext ]
# Extension for CRLs (`man x509v3_config`).
authorityKeyIdentifier=keyid:always
[ ocsp ]
# Extension for OCSP signing certificates (`man ocsp`).
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, OCSPSigning

这是一个非常重要的配置文件,指定了很多配置的目录,其中最重要的一个已经被抽取成了变量 dir。我们要做的就是指定 dir 的路径,并且根据下面的步骤来创建其余的目录和文件。
为了把创建证书的过程也自动化掉,笔者在 req 段添加了下面的配置:

[ req ]
prompt = no
input_password =

其中的 123456 就是后面创建的秘钥的密码,这样在创建 Certificate Signing Requests(csr) 时就不需要以交互的方式输入密码了。
下面的内容是默认的 CA 信息:

[ req_distinguished_name ]
countryName = CN
stateOrProvinceName = ShaanXi
localityName = Xian
organizationName = NickLi Ltd
organizationalUnitName = NickLi Ltd CA
commonName = NickLi Root CA
emailAddress = ljfpower@.com

准备目录和文件

在 rootca 目录下创建下面的目录和文件:

rootca/certs/           # 存放新建的证书
rootca/db/ # spenssl 用来存放信息的目录
rootca/private/ # 存放私钥
rootca/crl/
rootca/newcerts/ rootca/db/index
rootca/db/serial
rootca/db/crlnumber

其中的 rootca/private 目录需要 700 的权限,主要是为了既保证私钥的安全有能够创建私钥文件。rootca/db/serial 和 rootca/db/crlnumber 则需要被初始化为特定的值。简单起见我们可以使用下面的脚本来创建这些目录和文件:

#!/bin/bash

# create dir certs db private crl newcerts under rootca dir.
if [ ! -d rootca/certs ]; then
mkdir -p rootca/certs
fi if [ ! -d rootca/db ]; then
mkdir -p rootca/db
touch rootca/db/index
openssl rand -hex > rootca/db/serial
echo > rootca/db/crlnumber
fi if [ ! -d rootca/private ]; then
mkdir -p rootca/private
chmod rootca/private
fi if [ ! -d rootca/crl ]; then
mkdir -p rootca/crl
fi if [ ! -d rootca/newcerts ]; then
mkdir -p rootca/newcerts
fi

把上面的代码保存到 myca/roothelpler.sh 文件中,然后 cd 到 myca 目录下执行:

$ ./roothelpler.sh

此时当前目录为 myca,rootca 下的子目录和文件都已经创建成功。

创建 root 秘钥

进入 rootca 目录:

$ cd rootca

执行下面的命令创建私钥:

$ openssl genrsa -aes256 -out private/rootca.key.pem 

这里笔者设置的密码为:123456,记住这个密码,后面还会用到。然后为了确保安全,把秘钥的访问权限设置为 400:

$ chmod  private/rootca.key.pem

此时当前目录为 myca/rootca。

创建 Certificate Signing Requests(csr)

执行下面的命令创建 csr:

$ openssl req -new \
-config rootca.cnf \
-sha256 \
-key private/rootca.key.pem \
-out csr/rootca.csr.pem

下面的命令可以检查生成的 csr:

$ openssl req -text -noout -in csr/rootca.csr.pem

注意,csr 中包含了 CA 的基本信息,和公钥信息。

创建 CA 的根证书

有了前一步中生成的 csr,我们就可以通过下面的命令生成 CA 的根证书了:

$ openssl ca -selfsign \
-config rootca.cnf \
-in csr/rootca.csr.pem \
-extensions v3_ca \
-days \
-out certs/rootca.cert.pem

在交互式的提示中输入私钥的密码 123456,并同意其它的确认提示,就完成了根证书的生成操作。注意,上面命令中的 -selfsing 选项,它说明所有的根证书都是自签名的。同样,我们也可以通过命令来查看证书的详细信息:

$ openssl x509 -noout -text -in certs/rootca.cert.pem

其中的 Signature Algorithm 为签名算法;Issurer 是签发方,即签署证书的实体;Validity 指明证书的有效期为 2018-11-26 号至 2038-11-21 号;然后是公钥信息;Subject 指明证书自身的信息,这里 Issurer 和 Subject 的信息是一样的;下面还有 X509 协议相关的信息,这部分信息由配置文件 rootca.cnf 中的 [ v3_ca ] 段控制:

红框中的信息表明这个证书被用作 CA。

总结

至此我们已经为私有的 CA 创建了根证书,在接下来的《使用 OpenSSL 创建私有 CA:中间证书》一文中我们将详细的介绍如何创建 CA 的中间证书。

参考:
OpenSSL Certificate Authority
《openssl-cookbook》

使用 OpenSSL 创建私有 CA:1 根证书的更多相关文章

  1. 使用 OpenSSL 创建私有 CA:3 用户证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 在前文&l ...

  2. 使用 OpenSSL 创建私有 CA:2 中间证书

    OpenSSL 创建私有 CA 三部曲:使用 OpenSSL 创建私有 CA:1 根证书使用 OpenSSL 创建私有 CA:2 中间证书使用 OpenSSL 创建私有 CA:3 用户证书 本文将在前 ...

  3. 创建私有CA并签发证书

    一.创建私有CA 1.创建所需要的文件 2.创建私有密钥 3.CA自签证书 -new: 生成新证书签署请求:               -x509: 专用于CA生成自签证书:不自签的时候不要加该选项 ...

  4. OpenSSL创建私有CA

    1.编辑/etc/pki/tls/openssl.cnf [ CA_default ] dir             = /etc/pki/CA           # 工作目录certs      ...

  5. 如何通过Openssl实现私有CA,并为HTTP服务提供TLS/SLL安全机制

    原文链接:http://guodayong.blog.51cto.com/263451/1181059 Openssl是SSL的开源实现(可以免费下载应用程序),是一种安全机密程序,主要用于提高远程登 ...

  6. 自签名证书和私有CA签名的证书的区别 创建自签名证书 创建私有CA 证书类型 证书扩展名【转】

    自签名的证书无法被吊销,CA签名的证书可以被吊销 能不能吊销证书的区别在于,如果你的私钥被黑客获取,如果证书不能被吊销,则黑客可以伪装成你与用户进行通信   如果你的规划需要创建多个证书,那么使用私有 ...

  7. Openssl与私有CA搭建

    转自:http://www.tuicool.com/articles/aURnim 随着网络技术的发展.internet的全球化,信息共享程度被进一步提高,各种基于互联网的应用如电子政务.电子商务日益 ...

  8. Linux操作系统安全-局域网私有CA(Certificate Authority)证书服务器实战篇

    Linux操作系统安全-局域网私有CA(Certificate Authority)证书服务器实战篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.试验架构说明 node101 ...

  9. 搭建私有CA并实现证书颁发

    一.搭建私有CA服务器 1.安装包 # yum -y install openssl 2.生成密钥对儿 # cd /etc/pki/CA # (umask 077;openssl genrsa -ou ...

随机推荐

  1. vue自定义一个v-model

    目标 js <template> <my-form v-model="form"> </my-form> </template> & ...

  2. Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数

    反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...

  3. windows网络编程中文 笔记(二)

    IPv4 地址段 IPv4地址类别 种类 网络部分 第1个数字 端点数字 A  8位  0-127  16777216 B  16位  128-191  65526 C  24位  193-223   ...

  4. Python爬取网络图片

    代码: import urllib import urllib.request import re #打开网页,下载器 def open_html ( url): require=urllib.req ...

  5. Windows安装paramiko和PyCharm工程导入

    借鉴了CSDN博主Liam_Fang的paramiko安装 原文链接:https://blog.csdn.net/weixin_39912556/article/details/80543829 前提 ...

  6. Shell编程基础知识(一)

    一.基本的运行Linux程序的3种方法: (1) 使文件具有可执行权限,直接运行文件.eg:  chmod a+x testfile.sh   ./testfile.sh (2) 直接调用命令解释器来 ...

  7. pycharm 新建文件自动添加表头信息

    根据图示设置: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : ${DATE} ${TIME} # @Author : Adong

  8. LeetCode算法题-Add Strings(Java实现)

    这是悦乐书的第223次更新,第236篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第90题(顺位题号是415).给定两个非负整数num1和num2表示为字符串,返回num ...

  9. Go学习笔记08-包

    Go学习笔记08-包 Go语言 封装 包 封装 CamelCase命名规则 首字母大写:public 首字母小写:private 包 一个目录即一个包 main包为可执行入口,只能有一个main包 为 ...

  10. 安利一波:Adobe 2019全家桶 破解版

    之前发过一篇Photoshop破解的文章,今天把笔记本换了个系统,发现之前那个amtlib.dll替换破解的方式不适用于最新版的Adobe 2019 CC系列了,刚好看到群里有大佬分享了一个全家桶,给 ...