基于 OpenSSL 自建 CA 和颁发 SSL 证书

更多精彩文章https://deepzz.com
Desc:基于 openssl,自建 CA,颁发证书

自建 CA 颁发证书不仅可以用来鉴权,而且使你的通信更加的安全(请保护好你的证书)。在实际的软件开发中,越来越多的服务用到 HTTPS,证书的需求随之增加。那么对于我们开发者,通过自签名证书来进行测试必将非常的方便。so,有一个自己的 CA 是不是非常的库呢!下面我们一步步操作,创建我们自己的 CA。

由于 Mac 自带的 openssl 版本过低,请安装更高版本。

建立 CA

所有命令均在同一目录执行,没有进行跳转。

$ mkdir -p ./demoCA/{private,newcerts} && \
    touch ./demoCA/index.txt && \
    touch ./demoCA/serial && \
    echo 01 > ./demoCA/serial

通过以上命令,你将得到如下目录:

$ tree
.
└── demoCA
    ├── index.txt
    ├── newcerts
    ├── private
    └── serial

生成 CA 根密钥

$ openssl genrsa -des3 -out ./demoCA/private/cakey.pem 2048 #可以去掉des,以后签证书不用输密码

生成 CA 证书请求

$ openssl req -new -days 3650 -key ./demoCA/private/cakey.pem -out careq.pem

自签发 CA 根证书

$ openssl ca -selfsign -in careq.pem -out ./demoCA/cacert.pem

以上合二为一

$ openssl req -new -x509 -days 3650 -key ./demoCA/private/cakey.pem -out ./demoCA/cacert.pem

到这里,我们已经有了自己的 CA 了,下面我们开始为用户颁发证书。

为用户颁发证书

生成用户 RSA 密钥

$ openssl genrsa -des3 -out userkey.pem 2048 # 4096

生成用户证书请求

$ openssl req -new -days 365 -key userkey.pem -out userreq.pem # NO SAN

$ openssl req -new -days 365 -key userkey.pem -out userreq.pem -config openssl.cnf #SAN

使用 CA 签发证书

$ openssl ca -in userreq.pem -out usercert.pem # NO SAN

$ openssl ca -in userreq.pem -out usercert.pem -config openssl.cnf -extensions v3_req #SAN

其他证书操作

  • 查看证书的内容:$ openssl x509 -in cert.pem -text -noout
  • 吊销证书:$ openssl ca -revoke cert.pem -config openssl.cnf
  • 证书吊销列表:$ openssl ca -gencrl -out cacert.crl -config openssl.cnf
  • 查看列表内容:$ openssl crl -in cacert.crl -text -noout

openssl.cnf

上面步骤中,你可以观察到 SANNO SAN 标记。那么什么是 SAN,SAN(Subject Alternative Name)是 SSL 标准 x509 中定义的一个扩展。使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。所以,只执行 NO SAN 命令也可以签发证书,不过却不能够添加多个域名。

想要添加多个域名或泛域名,你需要使用到该扩展。那么默认的 OpenSSL 的配置是不能够满足的,我们需要复制或下载一份默认的 openssl.cnf 文件到本地。如 github openssl。这里我已经准备好一份 openssl.cnf

修改匹配策略

默认匹配策略是:国家名,省份,组织名必须相同(match)。我们改为可选(optional),这样避免我们生成证书请求文件时(csr)去参考 CA 证书。

# For the CA policy
[ policy_match ]
countryName         = match
stateOrProvinceName     = optional
organizationName        = optional
organizationalUnitName      = optional
commonName          = supplied
emailAddress            = optional

修改默认值

这是可选项,修改默认值,可以让你更快的颁发证书,一直回车就可以了:

[ req_distinguished_name ]
countryName         = Country Name (2 letter code)
countryName_default     = CN
countryName_min         = 2
countryName_max         = 2

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = Shanghai

localityName            = Locality Name (eg, city)
localityName_default        = Shanghai

0.organizationName      = Organization Name (eg, company)
0.organizationName_default      = deepzz

# we can do this but it is not needed normally :-)
#1.organizationName     = Second Organization Name (eg, company)
#1.organizationName_default = World Wide Web Pty Ltd

organizationalUnitName      = Organizational Unit Name (eg, section)
organizationalUnitName_default  = deepzz

关键步骤

最关键的地方是修改 v3_req。添加成如下:

[ v3_req ]

# Extensions to add to a certificate request

basicConstraints        = CA:FALSE
keyUsage            = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName          = @alt_names

[ alt_names ]
DNS.1 = abc.com
DNS.2 = *.abc.com
DNS.3 = xyz.com
IP.1 = 127.0.0.1

每次如果你要签发不同域名或 IP,可以直接修改 [ alt_names ]

注意之后的操作,均要指定 -config openssl.cnf

再来看看我们的目录结构:

$ tree
.
├── demoCA
│   ├── cacert.pem
│   ├── index.txt
│   ├── index.txt.attr
│   ├── index.txt.attr.old
│   ├── index.txt.old
│   ├── newcerts
│   │   └── 01.pem
│   ├── private
│   │   └── cakey.pem
│   ├── serial
│   └── serial.old
├── openssl.cnf
├── usercert.pem
├── userkey.pem
└── userreq.pem
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,724评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,104评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,142评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,086评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,076评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,914评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,220评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,871评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,318评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,834评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,951评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,574评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,162评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,162评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,383评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,349评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,652评论 2 343

推荐阅读更多精彩内容

  • 1 概述 本文之所以称之为半自动化,是因为证书的申请并非日常工作,只是一段时间才需要申请,同时,在创建证书和办法证...
    ghbsunny阅读 2,140评论 0 1
  • CA和证书安全协议(SSL/TLS)OpenSSH 一、CA和证书 (一) PKI(Public Key Infr...
    哈喽别样阅读 1,383评论 0 0
  • 1.PKI: Public Key Infrastructure 签证机构:CA(Certificate Auth...
    尛尛大尹阅读 888评论 0 0
  • 貌似码农很难找到高颜值女票,比如我们公司近百号码农,收入也都还不错,但女票漂亮的并不多,甚至很多2-3年了还找不到...
    方老司阅读 1,929评论 1 2
  • 三 进入vim 1.使用vim命令进入vim界面 vim后面加上你要打开的已存在的文件名或者不存在(则作为新建文件...
    11010tianyi阅读 232评论 0 0