私鑰檔案格式彙整PEM/DER,PKCS#1,PKCS#8,OpenSSH

最近稿了SSL/TLS雙向連結,被稿的糊里糊塗,所以整理了私鑰檔案的格式彙整在這篇。

PEM/DER

PEM和DER是兩種主流的檔案格式,PEM常見於Linux,DER則常見於Java。不過這兩種格式其實不是只能放置私鑰資料,也可以放置憑證簽署要求(CSR), 憑證(Certificate),端看其中的內容而定。

  • DER (Distinguished Encoding Rules)是一種二進位檔案格式,編碼格式定義在ASN.1標準中,需要使用程式打開成人們可讀的文字。
  • PEM (Privacy Enhanced Mail)是一文字格式,可直接用文字編輯器即可打開查看,會有一對BEGIN/END挾著以BASE64編碼過的DER資料二進位資料。

生成PEM私鑰

openssl genrsa -out prv_key.pem 4096

openssl genrsa預設生成的PEM私鑰內容如下

-----BEGIN RSA PRIVATE KEY-----

...

-----END RSA PRIVATE KEY-----

這是pkcs#1格式,下面會提到

PEM/DER私鑰格式轉換

轉換PEM格式成DER格式

openssl rsa -in private.key -outform der -out private.der

轉換DER格式成PEM格式

openssl rsa -in private.der -outform pem -out private.key

透過-outform指定輸出格式

PEM私鑰檔案內容

關於私鑰與公鑰現在常用的是pkcs#1和pkcs#8,可參考wiki:公鑰密碼學標準
  • Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications  參考RFC8017
  • Public-Key Cryptography Standards (PKCS) #8: Private-Key Information Syntax Standard 參考
    使用於apache和nginx

PKCS#1私鑰檔案內容如下

-----BEGIN RSA PRIVATE KEY-----

...

-----END RSA PRIVATE KEY-----

PKCS#1加密過變成

-----BEGIN RSA PRIVATE KEY-----

Proc-Type: 4,ENCRYPTED

DEK-Info: ...

...

-----END RSA PRIVATE KEY-----

PKCS#8私鑰檔案內容如下

-----BEGIN PRIVATE KEY-----

...

-----END PRIVATE KEY-----

PKCS#8加密過變成

-----BEGIN ENCRYPTED PRIVATE KEY-----

...

-----END ENCRYPTED PRIVATE KEY-----


備註:openssl genrsa預設生成PKCS#1私鑰 openssl req預設生成PKCS#8私鑰

PKCS間的私鑰轉換

生成PKCS#1私鑰

openssl genrsa -out prv_pkcs1.key 4096

openssl genrsa預設使用 PKCS#1格式私鑰

轉換PKCS#1私鑰成PKCS#8私鑰

openssl pkcs8 -topk8 -in prv_pkcs1.key -nocrypt -out prv_pkcs8.key

使用openssl pkcs8可進行私鑰轉換

轉換PKCS#8私鑰成PKCS#1私鑰

openssl rsa -in prv_pkcs8.key out prv.key

轉換回PKCS#1則是用回openssl rsa來處理


OpenSSH私鑰格式

ssh也會使用到私鑰,它生成key是使用ssh-keygen,並且同時會產生私鑰x和公鑰x.pub,預設的格式為RFC4716,可透過-m指定輸出格式
  1. RFC4716 (RFC 4716/SSH2 public or private key)
  2. PKCS8 (PKCS8 public or private key)
  3. PEM (PEM public key)

預設格式或指定RFC4716時

ssh-keygen -b 4096 -t rsa -f prv.key

-----BEGIN OPENSSH PRIVATE KEY-----

...

-----END OPENSSH PRIVATE KEY-----

指定輸出格式為PKCS8時

ssh-keygen -b 4096 -t rsa -f prv.pkcs8.pem -m PKCS8

-----END PRIVATE KEY-----

...

-----END PRIVATE KEY-----

指定輸出格式為PEM時

ssh-keygen -b 4096 -t rsa -f prv.key.pem -m PEM

-----BEGIN RSA PRIVATE KEY-----

...

-----END RSA PRIVATE KEY-----


留言