用openssl 和 keytool 生成 SSL證書

SSL(Secure Sockets Layer (SSL) and Transport Layer Security (TLS))被設(shè)計為加強Web安全傳輸(HTTP/HTTPS/)的協(xié)議(事實上還有SMTP/NNTP等) ,默認使用443端口

1. openssl vs keytool

openssl 適用范圍廣泣洞。

keytool 單獨針對 java application

  • 需要安裝 jre 之后才會有 keytool
  • java只能用 Java Keystore铡买,而它需要keytool 工具生成直撤。
  • keystore 可以把私鑰和證書放一起,只用一個文件骇钦。

2. 什么是x509證書鏈

數(shù)字證書是現(xiàn)代互聯(lián)網(wǎng)中個體間相互信任的基石诬垂。

如果沒有了數(shù)字證書,那么也就沒有了各式各樣的電商平臺以及方便的電子支付服務(wù)幕帆。目前我們所提到的數(shù)字證書都是基于 ITU 制定的 X.509 標準。

簡單來說赖条,數(shù)字證書就是一張附帶了數(shù)字簽名的信息表失乾。

image

x509證書一般會用到三類文件,key纬乍,csr碱茁,crt。

Key是私用密鑰仿贬,openssl格式纽竣,通常是rsa算法。

csr是證書請求文件(certificate signing request)茧泪,用于申請證書蜓氨。在制作csr文件的時候,必須使用自己的私鑰來簽署申請队伟,還可以設(shè)定一個密鑰穴吹。

crt是CA認證后的證書文件(certificate),簽署人用自己的key給你簽署的憑證嗜侮。

3. openssl 方式

CA根證書的生成步驟

生成CA私鑰(.key)-->生成CA證書請求(.csr)-->自簽名得到根證書(.crt)(CA給自已頒發(fā)的證書)刀荒。

本質(zhì)上就是用私鑰去獲取證書代嗤,然后把這兩個文件一起放到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),等對方發(fā)來證書姨拥。(當(dāng)然這是要花錢的)

3.4 把證書放到web 服務(wù)器绅喉,并配置生效

比如Nginx服務(wù)器,把 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";

重啟服務(wù)生效

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是為了省錢,一個證書給多個網(wǎng)址使用憨奸。如果用之前的交互方式來申請證書革屠,根本沒有地方來輸入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數(shù)據(jù)證書的管理工具 , Keytool將密鑰(key)和證書(certificates)存在一個稱為keystore的文件中。

這是java專用方式盐类,過程跟openssl 類似寞奸。

  • 創(chuàng)建一個新的證書JKS(Java Key Store)文件(里面包含了一個新生成的服務(wù)器密鑰)
  • 生成證書請求 CSR(Certificate Signung Request)
  • 獲取簽名(或者自簽名)
  • 導(dǎo)入一個簽名后的證書文件到j(luò)ks文件中 (Add Data to the Keystore)

服務(wù)器配置可以使用私鑰+證書合并在一起的文件,如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 來實現(xiàn)自簽名(根據(jù)證書請求生成證書)硬毕。

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 導(dǎo)入簽名后的證書文件到j(luò)ks文件中

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

導(dǎo)出keystore里面的指定證書

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

參考文檔

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末呻引,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吐咳,更是在濱河造成了極大的恐慌逻悠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件韭脊,死亡現(xiàn)場離奇詭異童谒,居然都是意外死亡,警方通過查閱死者的電腦和手機沪羔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門饥伊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來象浑,“玉大人,你說我怎么就攤上這事琅豆∮洳颍” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵茫因,是天一觀的道長蚪拦。 經(jīng)常有香客問我,道長冻押,這世上最難降的妖魔是什么驰贷? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮洛巢,結(jié)果婚禮上括袒,老公的妹妹穿的比我還像新娘。我一直安慰自己稿茉,他們只是感情好锹锰,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狈邑,像睡著了一般城须。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上米苹,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天糕伐,我揣著相機與錄音,去河邊找鬼蘸嘶。 笑死良瞧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的训唱。 我是一名探鬼主播褥蚯,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼况增!你這毒婦竟也來了赞庶?” 一聲冷哼從身側(cè)響起仆嗦,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤钱贯,失蹤者是張志新(化名)和其女友劉穎粹舵,沒想到半個月后倘潜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡证逻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年涡真,在試婚紗的時候發(fā)現(xiàn)自己被綠了篙贸。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颊艳。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡茅特,死狀恐怖忘分,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情白修,我是刑警寧澤妒峦,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站熬荆,受9級特大地震影響舟山,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卤恳,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寒矿。 院中可真熱鬧突琳,春花似錦、人聲如沸符相。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啊终。三九已至镜豹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蓝牲,已是汗流浹背趟脂。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留例衍,地道東北人昔期。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像佛玄,于是被迫代替她去往敵國和親硼一。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 用openssl生成nginx.key 1.key的生成openssl genrsa -des3 -out ser...
    灝瑋閱讀 15,087評論 0 1
  • CA和證書安全協(xié)議(SSL/TLS)OpenSSH 一梦抢、CA和證書 (一) PKI(Public Key Infr...
    哈嘍別樣閱讀 1,383評論 0 0
  • SSL(Secure Socket Layer奥吩,安全套接字層)是為網(wǎng)絡(luò)通信提供安全保障和數(shù)據(jù)完整性的一種安全協(xié)議哼蛆,...
    CHUANHAI閱讀 1,837評論 0 7
  • 我橫沖直撞 馬路上搖搖晃晃 雜樂、車鳴 哪里是一個方向 回頭是人群 向前是絕望 沒有一顆勇敢的心 你上哪去流浪 閉...
    荒蕪年月閱讀 48評論 0 0
  • 生命陪伴心語系統(tǒng): (當(dāng)下)此刻就是我享受愛圈驼,體驗愛和表達愛的最大機會 (過程)深呼吸一人芽,二,三绩脆,我看見了我的情緒...
    洪蕓閱讀 173評論 0 8