自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

使用OpenSSL實(shí)現(xiàn)私鑰和證書的轉(zhuǎn)換

移動(dòng)開(kāi)發(fā) iOS
近期在項(xiàng)目中iOS需要用到APNs的推送,而公司的iOS女同事(純哥)只給了我2個(gè)p12格式的文件。突然發(fā)現(xiàn),證書的轉(zhuǎn)換問(wèn)題還是比較常見(jiàn)的,比如之前支付開(kāi)發(fā)。而在程序中,實(shí)際需要使用的是pem格式的證書,因此這里涉及到證書之間的轉(zhuǎn)換問(wèn)題。由于私鑰和證書可以以不同格式的存儲(chǔ),這意味著我們需要對(duì)它們進(jìn)行轉(zhuǎn)換。

[[171102]]

近期在項(xiàng)目中iOS需要用到APNs的推送,而公司的iOS女同事(純哥)只給了我2個(gè)p12格式的文件。突然發(fā)現(xiàn),證書的轉(zhuǎn)換問(wèn)題還是比較常見(jiàn)的,比如之前支付開(kāi)發(fā)。而在程序中,實(shí)際需要使用的是pem格式的證書,因此這里涉及到證書之間的轉(zhuǎn)換問(wèn)題。

由于私鑰和證書可以以不同格式的存儲(chǔ),這意味著我們需要對(duì)它們進(jìn)行轉(zhuǎn)換。而大多數(shù)常用的格式如下,首先是證書的格式:

  • 二進(jìn)制的DER證書,包含X.509證書為原始格式,使用DER ASN.1編碼。
  • ASCII的PEM證書,包含1個(gè)base64編碼的DER證書,以-----BEGIN CERTIFICATE-----開(kāi)頭而以-----END CERTIFICATE-----結(jié)束。
  • PKCS#7證書,1個(gè)復(fù)雜格式的設(shè)計(jì)用于傳輸簽名或加密數(shù)據(jù),定義在RFC 2315中。通常以.p7b和.p7c作為后綴且可以包含整個(gè)證書鏈。這種格式被Java的keytool工具支持。
  • PKCS#12(PFX)的證書和私鑰,1個(gè)復(fù)雜的格式它可以存儲(chǔ)和保護(hù)1個(gè)服務(wù)器的私鑰并和1個(gè)完整的證書鏈一起。它通常以.p12和.pfx為后綴。這種格式常用于微軟的產(chǎn)品,不過(guò)也可以用于客戶端證書。

然后是對(duì)應(yīng)的私鑰的格式:

  • 二進(jìn)制的DER私鑰,包含1個(gè)私鑰以原始形式,使用DER ASN.1編碼。OpenSSL以它傳統(tǒng)的SSLeay格式創(chuàng)建私鑰,不過(guò)也可以使用另外1種稱為PKCS#8,但不廣泛使用的格式(定義在RFC 5208)。在OpenSSL中可以使用pkcs8命令來(lái)進(jìn)行PKCS#8格式的處理操作。
  • ASCII格式的私鑰,包含1個(gè)base64編碼的DER私鑰,有些時(shí)候有一些額外的元信息,例如密碼保護(hù)采用的算法。

說(shuō)了這么多,可以發(fā)現(xiàn)對(duì)于私鑰之間的轉(zhuǎn)換就簡(jiǎn)單的很多,只能在DER和PEM格式之間進(jìn)行轉(zhuǎn)換。而相比證書之間的轉(zhuǎn)換,就稍微復(fù)雜一些。

如果有興趣還可以查看我的另一篇文章PKI格式標(biāo)準(zhǔn)查看其概念。

在這里,我們需要將PKCS#12格式的文件中提取出私鑰和證書。下面我們先從PEM和DER格式的轉(zhuǎn)換開(kāi)始:

PEM和DER轉(zhuǎn)換

PEM和DER格式證書的轉(zhuǎn)換可以通過(guò)OpenSSL提供的x509工具來(lái)完成。下面我們轉(zhuǎn)換1個(gè)DER格式的證書為PEM:

  1. sky@sky-pc:~$ openssl x509 -inform DER -in private_key.der -outform PEM -out private_key.pem 

在這里,我們通過(guò)-inform參數(shù)指定輸入的格式為DER,通過(guò)-in參數(shù)指定輸入的文件名稱,而后對(duì)應(yīng)的-outform和-out用于指定輸出的格式及文件名稱。

同樣的,我們也可以將PEM格式的整數(shù)轉(zhuǎn)換為DER格式:

  1. sky@sky-pc:~$ openssl x509 -inform PEM -in private_key.pem -outform DER -out private_key.der 

下面我們來(lái)看下如何從PKCS#12格式中提取出私鑰和證書。

PKCS#12轉(zhuǎn)換

我們可以使用OpenSSL提供的pkcs12命令來(lái)實(shí)現(xiàn)PKCS#12格式的操作,首先我們將證書和私鑰導(dǎo)出為PEM格式:

  1. sky@sky-pc:~$ openssl pkcs12 -in key.p12 -out key.pem -nodes 
  2. Enter Import Password
  3. MAC verified OK  

在這里,我們通過(guò)-in參數(shù)指定傳入的文件名稱,而-out文件指定輸出的文件名稱,而-nodes參數(shù)表示不對(duì)私鑰進(jìn)行加密。在這個(gè)過(guò)程中,我們需要輸入簽名時(shí)的密碼。

如果我們不添加-nodes參數(shù),將是如下的結(jié)果:

  1. sky@sky-pc:~$ openssl pkcs12 -in key.p12 -out key.pem 
  2. Enter Import Password
  3. MAC verified OK 
  4. Enter PEM pass phrase: 
  5. Verifying - Enter PEM pass phrase:  

可以看到,驗(yàn)證簽名成功后還需要我們重新輸入新的加密口令。而在導(dǎo)出的文件中可以看到此時(shí)文件的內(nèi)容為: 

  1. ... 
  2. -----BEGIN ENCRYPTED PRIVATE KEY----- 
  3. MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIPdUUocbjDXUCAggA 
  4. ... 
  5. -----END ENCRYPTED PRIVATE KEY-----  

而添加-nodes后的結(jié)果為:

  1. ... 
  2. -----BEGIN PRIVATE KEY----- 
  3. MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC+QDKKakQ0fcvH 
  4. ... 
  5. -----END PRIVATE KEY-----  

之后,我們就可以使用編輯器打開(kāi)輸出的key.pem文件,手動(dòng)的拆分它們?yōu)楠?dú)立的私鑰、證書和中間證書文件。

作為程序猿,一般人都是懶惰的,這個(gè)繁瑣的操作能不能簡(jiǎn)便些呢,讓機(jī)器自己去完成呢?

其實(shí)是可以做到的,在OpenSSL中提供這樣的操作,我們先來(lái)看看不導(dǎo)出證書的操作,這樣我們就可以得到私鑰了:

  1. sky@sky-pc:~$ openssl pkcs12 -in key.p12 -nocerts -out private_key.pem -nodes 
  2. Enter Import Password
  3. MAC verified OK  

可以看到,在這里我們多添加了1個(gè)-nocerts的參數(shù)就做到了不導(dǎo)出證書的操作。那么不導(dǎo)出私鑰的操作應(yīng)該如下:

  1. sky@sky-pc:~$ openssl pkcs12 -in key.p12 -nokeys -out cert.pem -nodes 
  2.  
  3. Enter Import Password
  4.  
  5. MAC verified OK  

接下來(lái),我們?cè)撊绾螌EM格式的證書和私鑰導(dǎo)出為PKCS#12格式呢,我們可以這樣來(lái)操作:

  1. sky@sky-pc:~$ openssl pkcs12 -name "My Certificate" -export -out fd.p12 -inkey key.pem -in cert.pem -certfile fd-chain.crt 
  2.  
  3. Enter Export Password
  4.  
  5. Verifying - Enter Export Password 

其中,-name選項(xiàng)指定了證書中的friendlyName,而-certfile指定信任鏈的文件名稱。

最后,我們還可以通過(guò)-clcerts和-cacerts選項(xiàng)指定是否只導(dǎo)出客戶端及CA證書。

PKCS#7轉(zhuǎn)換

為了轉(zhuǎn)換PEM為PKCS#7,我們可以使用crl2pkcs7命令。

  1. sky@sky-pc:~$ openssl crl2pkcs7 -nocrl -out key.p7b -certfile cert.pem -certfile fd-chain.crt 

那么,生成的文件頭部將以-----BEGIN PKCS7-----開(kāi)始。

最后,為了轉(zhuǎn)換PKCS#7為PEM,我們可以使用pkcs7命令:

  1. sky@sky-pc:~$ openssl pkcs7 -in key.p7b -print_certs -out key1.pem 

在這里,我們使用-print_certs參數(shù)將輸入的證書輸出。

PKCS#8與SSLeay轉(zhuǎn)換

如果我們想將PKCS#8格式的私鑰轉(zhuǎn)換為SSLeay格式,我們可以這樣來(lái)操作:

  1. sky@sky-pc:~$ openssl rsa -in key.pem -out ssleay.pem 
  2.  
  3. writing RSA key  

而此時(shí)文件的內(nèi)容將如下所示:

  1. -----BEGIN RSA PRIVATE KEY----- 
  2.  
  3. MIIEpQIBAAKCAQEAvkAyimpENH3Lx4d8VH96XCYfKfCZ7qVtNuVseAvkSTC0q5dw 
  4.  
  5. ... 
  6.  
  7. -----END RSA PRIVATE KEY-----  

可以看到頭部和尾部多追加了RSA的字樣。

而如果要將傳統(tǒng)的SSLeay私鑰轉(zhuǎn)換為PKCS#格式,我們需要使用pkcs8命令:

  1. sky@sky-pc:~$ openssl pkcs8 -topk8 -in ssleay.pem -out pkcs8_key.pem 
  2.  
  3. Enter Encryption Password
  4.  
  5. Verifying - Enter Encryption Password 

默認(rèn)情況下,會(huì)為該格式進(jìn)行1個(gè)加密的處理,但是我們可以通過(guò)-nocrypt參數(shù)讓其不進(jìn)行加密處理:

  1. sky@sky-pc:~$ openssl pkcs8 -topk8 -nocrypt -in ssleay.pem -out pkcs8_key.pem 

可以我們便實(shí)現(xiàn)了將傳統(tǒng)的SSLeay格式轉(zhuǎn)換為PKCS#8格式了。

APNs中證書的生成

下面我們來(lái)生成APNs推送時(shí)需要的證書。

  1. sky@sky-pc:~$ openssl pkcs12 -in cer.p12 -clcerts -nokeys -out cert.pem -nodes 
  2. Enter Import Password
  3. MAC verified OK 
  4. sky@sky-pc:~$ openssl pkcs12 -in cer.p12 -nocerts -out key.pem -nodes 
  5. Enter Import Password
  6. MAC verified OK 
  7. sky@sky-pc:~$ cat cert.pem key.pem > certs.pem  

我們先只導(dǎo)出客戶端的證書,然后是私鑰,最后我們將2個(gè)文件的內(nèi)容合并在1個(gè)文件中即可。

責(zé)任編輯:龐桂玉 來(lái)源: segmentfault
相關(guān)推薦

2020-06-08 10:14:55

OpenSSLSSL證書Linux

2021-03-31 11:29:12

OpenSSLDoS證書驗(yàn)證漏洞

2021-03-29 12:57:31

漏洞OpenSSLDos

2025-01-08 08:57:42

OpenSSL客戶端通信

2017-02-05 15:55:41

LinuxOpenSSLApache

2015-11-25 15:00:07

2023-03-20 08:14:11

PHP類型轉(zhuǎn)換

2018-07-31 16:16:04

UbuntuCurlOpenssl

2023-11-22 08:21:25

Android開(kāi)發(fā)場(chǎng)景

2021-05-08 05:56:15

加密OpenSSL密鑰

2024-02-26 08:05:00

Pythonpypinyin開(kāi)發(fā)

2019-04-11 10:47:59

NginxHTTPS自簽發(fā)證書

2019-11-12 11:15:39

setTimeout前端代碼

2022-07-20 23:15:11

Flink數(shù)據(jù)集CDC

2024-09-03 10:06:43

JavaMap項(xiàng)目

2021-03-29 08:54:42

StampedLock線程開(kāi)發(fā)技術(shù)

2023-03-15 10:38:55

2019-02-18 14:18:04

2024-03-29 11:33:23

轉(zhuǎn)換[]bytestring
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)