Linux(PHP)系のプログラムとMicrosoft(.Net)系のプログラムとで暗号化通信を行おうとした際に、鍵のフォーマット相違があり、一筋縄では行かなかったので、その原因と対策をざっくりメモ。
DERとPEM
ざっくり書くと、DERはバイナリデータ、PEMはBase64でエンコードしたデータ。
どちらもASN.1という構造体でデータは構成されている。
cf. http://qiita.com/kunichiko/items/12cbccaadcbf41c72735
PEM形式の秘密鍵の種類
○OpenSSH形式
OpenSSHのフォーマット。秘密鍵のヘッダーに以下の文字列。
-----BEGIN RSA PRIVATE KEY-----
○SECSH(ssh.com)形式
オリジナルのSSHのフォーマット。OpenSSHはssh1.2.12から派生。
秘密鍵のヘッダーに以下の文字列。
---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
○PuTTy形式
PuTTyのフォーマット。秘密鍵のヘッダーに以下の文字列。
PuTTY-User-Key-File-2: ssh-rsa
引用元 http://d.hatena.ne.jp/machua/20110809/1312899353
Linux系/Microsoft系での鍵フォーマット相違
DERとかPEMは、Linux系で利用されている鍵方式。Microsoft系は直接これらの鍵形式を扱えない(ASN.1ではなくPUBLICKEYBLOBというバイナリ構造体を使ってるっぽい)ので、Linux系/Microsoft系(.netとか)間で暗号化を行う場合は鍵フォーマットをどちらかに揃えてあげる必要がある。
cf. C#と.Net Frameworkを使ってPem形式の秘密鍵や公開鍵をXML形式にして暗号化や署名する方法
http://www.k-karakuri.com/entry/2017/02/03/C%23%E3%81%A8_Net_Framework%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6Pem%E5%BD%A2%E5%BC%8F%E3%81%AE%E7%A7%98%E5%AF%86%E9%8D%B5%E3%82%84%E5%85%AC%E9%96%8B%E9%8D%B5%E3%82%92XML%E5%BD%A2%E5%BC%8F%E3%81%AB%E3%81%97
Windows上で、証明書や秘密鍵をPEM形式に変換してエクスポートする (1/2)
http://www.atmarkit.co.jp/ait/articles/1602/05/news039.html