用openssl 和 keytool 生成 SSL证书

SSL(Secure Sockets Layer (SSL) and Transport Layer Security (TLS))被设计为加强Web安全传输(HTTP/HTTPS/)的协议(事实上还有SMTP/NNTP等) ,默认使用443端口

1. openssl vs keytool

openssl 适用范围广。

keytool 单独针对 java application

  • 需要安装 jre 之后才会有 keytool
  • java只能用 Java Keystore,而它需要keytool 工具生成。
  • keystore 可以把私钥和证书放一起,只用一个文件。

2. 什么是x509证书链

数字证书是现代互联网中个体间相互信任的基石。

如果没有了数字证书,那么也就没有了各式各样的电商平台以及方便的电子支付服务。目前我们所提到的数字证书都是基于 ITU 制定的 X.509 标准。

简单来说,数字证书就是一张附带了数字签名的信息表。

image

x509证书一般会用到三类文件,key,csr,crt。

Key是私用密钥,openssl格式,通常是rsa算法。

csr是证书请求文件(certificate signing request),用于申请证书。在制作csr文件的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥。

crt是CA认证后的证书文件(certificate),签署人用自己的key给你签署的凭证。

3. openssl 方式

CA根证书的生成步骤

生成CA私钥(.key)-->生成CA证书请求(.csr)-->自签名得到根证书(.crt)(CA给自已颁发的证书)。

本质上就是用私钥去获取证书,然后把这两个文件一起放到server,以此来证明我就是我

3.1 生成CA私钥(.key)

openssl genrsa -out ca.key 2048

$ openssl genrsa -out ca.key 2048
Generating RSA private key, 2048 bit long modulus
...+++
...........................................................................................+++
e is 65537 (0x10001)

3.2 生成CA证书请求(.csr)

openssl req -new -key ca.key -out ca.csr

$ openssl req -new -key ca.key -out ca.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]:Guangdong
Locality Name (eg, city) []:guangzhou
Organization Name (eg, company) [Internet Widgits Pty Ltd]:roytest
Organizational Unit Name (eg, section) []:unit name
Common Name (e.g. server FQDN or YOUR name) []:small-nginx
Email Address []:royzeng@mail.com

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

上面是交互式输入,非交互的方式如下

$ openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=roytest/CN=small-nginx"

3.3 自签名得到根证书(.crt)

openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

$ openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
Signature ok
subject=/C=CN/ST=Guangdong/L=guangzhou/O=roytest/OU=unit name/CN=small-nginx/emailAddress=royzeng@mail.com
Getting Private key

自签名是免费/测试的证书,浏览器默认不认可。

通常的方法是:提交CSR到证书公司(比如VeriSign,Inc),等对方发来证书。(当然这是要花钱的)

3.4 把证书放到web 服务器,并配置生效

比如Nginx服务器,把 ca.key 和 ca.crt 放到 /etc/nginx/certs 目录。修改/etc/nginx/nginx.conf

    server {
        listen       443 ssl http2 default_server;
        .....

        ssl_certificate "/etc/nginx/certs/ca.crt";
        ssl_certificate_key "/etc/nginx/certs/ca.key";

重启服务生效

3.5 进阶:制作多域名的CSR文件

引入一个概念:SAN

SAN stands for “Subject Alternative Names” and this helps you to have a single certificate for multiple CN (Common Name).

Reduce SSL cost and maintenance by using a single certificate for multiple websites using SAN certificate

简而言之,用SAN是为了省钱,一个证书给多个网址使用。如果用之前的交互方式来申请证书,根本没有地方来输入SAN,要解决这问题,需用到配置文件。

配置cnf文件

[ req ]
default_bits       = 2048 
distinguished_name = req_distinguished_name 
req_extensions     = req_ext 
prompt = no 
[ req_distinguished_name ]
countryName                = 所属国家 
stateOrProvinceName        = 省份 
localityName               = 城市
organizationName           = 公司名称 
organizationalUnitName     = 部门 
commonName                 = 域名 
[ req_ext ] 
subjectAltName = @alt_names 
[alt_names] 
DNS.1   = 域名 (注意,commonName 要在这里再写一次)
DNS.2   = 子域名1
DNS.3   = 子域名2
...

The entries in SAN certificate:

  • CAN be a Fully Qualified Domain Name (FQDN).
  • CAN be a wildcard domain name (i.e. *.domain.com or *.store.domain.com) but NOT a multiple-level wildcard (like *.*.domain.com).

生成CSR

Create new Private Key and Certificate Signing Request

生成 private key 和 生成 CSR 合并成一步

openssl req -out ca.csr -newkey rsa:2048 -nodes -keyout private.key -config san.cnf

例子

$ openssl req -out ca.csr -newkey rsa:2048 -nodes -keyout ca.key -config san.cnf
Generating a 2048 bit RSA private key
.....................+++
......+++
writing new private key to 'ca.key'
-----

于是 ca.csr ca.key 都生成了,csr 用于申请证书。

4. keytool 方式

Keytool 是一个Java数据证书的管理工具 , Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中。

这是java专用方式,过程跟openssl 类似。

  • 创建一个新的证书JKS(Java Key Store)文件(里面包含了一个新生成的服务器密钥)
  • 生成证书请求 CSR(Certificate Signung Request)
  • 获取签名(或者自签名)
  • 导入一个签名后的证书文件到jks文件中 (Add Data to the Keystore)

服务器配置可以使用私钥+证书合并在一起的文件,如jks或者pkcs12文件,这类文件一般叫key.keystore。(openssl使用两个文件)

4.1 生成新的证书文件(Java Key Store)

keytool -genkeypair -keystore certificate.jks -alias roykey -storetype pkcs12 -keyalg RSA -keysize 2048

$ keytool -genkeypair -alias cdserver -keystore jenkins-cd.jks -keyalg RSA -keysize
2048 -storetype PKCS12
Enter keystore password:
Re-enter new password:
What is your first and last name?
  [Unknown]:  www.myexample.com
What is the name of your organizational unit?
  [Unknown]:  IT service
What is the name of your organization?
  [Unknown]:  commany name
What is the name of your City or Locality?
  [Unknown]:  Guangzhou
What is the name of your State or Province?
  [Unknown]:  Guangdong
What is the two-letter country code for this unit?
  [Unknown]:  CN
Is CN=www.myexample.com, OU=IT service, O=commany name, L=Guangzhou, ST=Guangdong, C=CN correct?
  [no]:  yes

4.2 生成一个CSR(Certificate Signung Request)证书申请文件

keytool -certreq -keystore certificate.jks -alias roykey -file server.csr

$ keytool -certreq -alias cdserver -keystore jenkins-cd.jks -file jenkins-cd.csr

Enter keystore password:

4.3 用CA对请求文件进行签名

(openssl 自签名参考上面)

测试阶段,也可以用keytool 来实现自签名(根据证书请求生成证书)。

keytool -gencert -keystore certificate.jks -alias roykey -infile server.csr -outfile ca.crt

$ keytool -gencert -keystore jenkins-cd.jks -alias cdserver -infile jenkins-cd.csr -outfile jenkins-cd.crt
Enter keystore password:

4.4 导入签名后的证书文件到jks文件中

keytool -importcert -alias roykey -file server.crt -keystore certificate.jks

$ keytool -importcert -alias cdserver -file jenkins-cd.crt -keystore jenkins-cd.jks
Enter keystore password:
Certificate reply was installed in keystore

4.5 配置java程序使用jks

用 jenkins 来举例

--httpsKeyStore=${JENKINS_CONF_DIR}/jenkins_certificate.jks --httpsKeyStorePassword=the_password_you_chose_for_the_keystore_earlier

4.6 其它keytool 命令

查看单个证书

keytool -printcert -v -file mydomain.crt

列出keystore存在的所有证书

keytool -list -v -keystore keystore.jks

使用别名查看keystore特定条目

keytool -list -v -keystore keystore.jks -alias mydomain

删除keystore里面指定证书

keytool -delete -alias mydomain -keystore keystore.jks

更改keysore密码

keytool -storepasswd -new new_storepass -keystore keystore.jks

导出keystore里面的指定证书

keytool -export -alias mydomain -file mydomain.crt -keystore keystore.jks

参考文档

https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html

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

推荐阅读更多精彩内容

  • 用openssl生成nginx.key 1.key的生成openssl genrsa -des3 -out ser...
    灏玮阅读 15,100评论 0 1
  • CA和证书安全协议(SSL/TLS)OpenSSH 一、CA和证书 (一) PKI(Public Key Infr...
    哈喽别样阅读 1,386评论 0 0
  • SSL(Secure Socket Layer,安全套接字层)是为网络通信提供安全保障和数据完整性的一种安全协议,...
    CHUANHAI阅读 1,863评论 0 7
  • 我横冲直撞 马路上摇摇晃晃 杂乐、车鸣 哪里是一个方向 回头是人群 向前是绝望 没有一颗勇敢的心 你上哪去流浪 闭...
    荒芜年月阅读 49评论 0 0
  • 生命陪伴心语系统: (当下)此刻就是我享受爱,体验爱和表达爱的最大机会 (过程)深呼吸一,二,三,我看见了我的情绪...
    洪芸阅读 174评论 0 8