1: Creating Your Own SSL Certificate Authority

HTTPS 现在已进入全网时代,现在大多数的应用,都是以 HTTPS 为通讯基础,而不再支持 HTTP。

无论是申请 iOS Develop,还是申请 网站 SSL 都需要创建一个 Certificate Request,然后提交给一个 CA 机构,由它来签发一个证书,费用不菲哦。


1. 几点说明

- CA 机构

CA 机构,就是指那些能把自己根证书放在主流系统、浏览器的商家。

- CA 根证书

该证书???

其实这个 CA 就是在操作系统里放了一张根证书(含公钥),然后用该证书的私钥不停的签发证书。在 OSX 上,打开 Keychain Access,可以看到操作系统内所集成的 CA 机构。

- SSL 证书

这个证书是由用户来提交,经由 CA 机构通过 CA 根证书来签名,进行签发的,一般会放在 Web Server 上使用。

- 为什么证书能使用

证书之所以能使用,是因为每个人的电脑里都有 CA 机构的根证书,然后由该 CA 机构签发的证书,都能够被正确识别。

像最常见的就是浏览器,Chrome/Edge/Firefox,如果一个 CA 机构能把自己的 CA 根证书集成到这几家里,基本上,就可以做生意来进行证书签发了。

苹果就是在自己的 Mac 设备里集成了 Apple 的根证书,所有开发者的申请,上线都是用的它自家的 CA 根证书进行签发的。

如果你是一家企业,你也可自己自已创建一个 CA 根证书,装在公司内的每一台电脑,服务器里,这样,就实现了自己签发证书的能力,然后免费在这些设备间享受 SSL 带来的安全性。


2. Create the Root Certificate

2.1 Create a Private Keychain

首为,我们需要为 Root Certification Authority Certificate 创建一个私钥。(!一定要保存好该私钥。)

1
2
3
4
5
6
7
8
# 创建带密码的私钥
$ openssl genrsa -out d2labs.key 2048
# 为了安全,一般都会给私钥加上密码(要牢记该密码)
$ openssl genrsa -des3 -out d2labs_des3.key 2048
# 可通过 OpenSSL 提取公钥:
$ openssl rsa -in d2labs.key -pubout -out d2labs_pub.key
  • genrsa - RSA 方式加密。
  • 2048 - 加密强度 (一般为 1024, 2048)。
  • des3 - 创建带密码的私钥。

2.2 Self-Sign this Certificate

利用私钥创建自签名根证书

1
$ openssl req -new -x509 -nodes -days 36500 -key d2labs.key -out d2labs_root_ca.crt

接着会有交互提示进行证书设定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Shanghai
Locality Name (eg, city) []:Shanghai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:D2Labs Co.,Ltd
Organizational Unit Name (eg, section) []:D2Labs Root CA
Common Name (e.g. server FQDN or YOUR name) []:D2Labs Root CA
Email Address []:ca@d2labs.cn
- /C 表示国家(Country),只能是国家字母缩写,如CN、US等;
- /ST 表示州或者省(State/Provice);
- /L 表示城市或者地区(Locality);
- /O 表示组织名(Organization Name);
- /OU 其他显示内容,一般会显示在颁发者这栏。
- /CN 表示

如果需要多次签发,避免每次输入,可以通过 subj 参数 直接指定:

1
2
$ openssl req -new -x509 -nodes -days 3650 -key d2labs.key -out d2labs_root_ca.crt \
-subj "/C=CN/ST=Shanghai/O=D2Labs Co.,Ltd/CN=D2Labs Root CA"
参数说明
  • req -
  • x509 - 表示这是一个自签名证书。
  • nodes -
  • days - 证书有效期,3650 表示 10 年。

这时,我们就拿到了一张有效期为 10 年的 CA 证书 d2labs_root_ca.crt 和一个签发该证书用的私钥 d2labs.key。有了这两样东西,我们就成为名副其实的 CA 机构,可以为其它公司签名证书了。


3. Install Root Certificate on Workstation

些时用该 CA 证书 签名出的证书,仍是不被信任的,只有在相关的设备上安装该 CA 证书,并设为受信才会有用。

- Mac OSX

双击 d2labs_root_ca.crt 文件,可以打开 Keychains Access,对证书进行导入,然后手工设定信任。(导入到 login 下,为当前用户可用,可以手工拖到 system 下,所有用户可用。)

或者,可以通过命令进行安装(直接安装到 system 下):

1
$ sudo security add-trusted-cert -d -r trustRoot -k "/Library/Keychains/System.keychain" "/Users/lanvige/ssl/d2labs_root_ca.crt"

OSX 安装受信该 CA 证书效果图:

- Windows

双击,下一步 …

- Ubuntu Server

Ubuntu 的证书存放目录为 /usr/share/ca-certificates,将自己签发的 CA 根证书,放到该目录下,然后进行认证就可以了。

认证的原理,就是更新 /etc/ca-certificates.conf,加入新添证书路径,取消认证就是在证书前加上 !

步骤如下:

  1. Create a directory for extra CA certificates in /usr/share/ca-certificates
1
$ sudo mkdir /usr/share/ca-certificates/extra
  1. Copy the ‘.crt’ file to the directory
1
$ sudo cp d2labs_root_ca.crt /usr/share/ca-certificates/extra/d2labs_root_ca.crt
  1. Let Ubuntu add the ‘.crt’ file’s path relative to /usr/share/ca-certificates to /etc/ca-certificates.conf
1
2
3
4
# 如果
$ sudo apt-get install ca-certificates
$ sudo dpkg-reconfigure ca-certificates

- CentOS Server

1. Install the ca-certificates package:
1
$ yum install ca-certificates
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Loaded plugins: fastestmirror
base | 3.6 kB 00:00:00
epel/x86_64/metalink | 4.9 kB 00:00:00
epel | 4.3 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
(1/2): epel/x86_64/updateinfo | 376 kB 00:00:00
(2/2): epel/x86_64/primary_db | 3.6 MB 00:00:12
Loading mirror speeds from cached hostfile
* base: mirrors.btte.net
* epel: ftp.riken.jp
* extras: mirrors.yun-idc.com
* updates: mirror.neu.edu.cn
Package ca-certificates-2015.2.4-70.0.el7_1.noarch already installed and latest version
Nothing to do
2. Enable the dynamic CA configuration feature:
1
$ update-ca-trust enable
3. Add it as a new file to /etc/pki/ca-trust/source/anchors/:
1
$ cp foo.crt /etc/pki/ca-trust/source/anchors/
4. Use command:
1
$ update-ca-trust extract

REF::