1. この記事の対象のひと

    • GolangでRSA秘密鍵・公開鍵(PEM・DER形式)を作りたい人

 

    • GolangでSubjectPublicKeyInfo(PEM・DER形式)を作りたい人

 

    GolangでPrivateKeyInfo(PEM・DER形式)を作りたい人

2. GolangでRSA秘密鍵作成

以下エラー処理は省略しますので悪しからず

2048bitのRSA秘密鍵作成

    //PKCS#1 format RSA PrivateKey [RFC8017]
    rsaPrivateKey, err := rsa.GenerateKey(rand.Reader, 2048)

DER形式で保存する

    derRsaPrivateKey := x509.MarshalPKCS1PrivateKey(rsaPrivateKey)
    f, err := os.Create("derFormatRsaPrivate.key")
    _, err = f.Write(derRsaPrivateKey)
    err = f.Close()

保存したDER形式のRSA秘密鍵をOpenSSLコマンドで確認する

openssl rsa -text -inform der -in derFormatRsaPrivate.key

PEM形式で保存する

    f, err = os.Create("pemFormatRsaPrivate.key")
    err = pem.Encode(f, &pem.Block{Type: "RSA PRIVATE KEY", Bytes: derRsaPrivateKey})
    err = f.Close()

保存したPEM形式のRSA秘密鍵をOpenSSLコマンドで確認する

openssl rsa -text -in pemFormatRsaPrivate.key

3. GolangでRSA公開鍵作成

2048bitのRSA公開鍵の作成

    //PKCS#1 format RSA PublicKey [RFC8017]
    var rsaPublicKey crypto.PublicKey
    rsaPublicKey = rsaPrivateKey.Public()

DER形式で保存する

    var derRsaPublicKey []byte
    if rsaPublicKeyPointer, ok := rsaPublicKey.(*rsa.PublicKey); ok {
        derRsaPublicKey = x509.MarshalPKCS1PublicKey(rsaPublicKeyPointer)
    }
    f, err = os.Create("derFormatRsaPublic.key")
    _, err = f.Write(derRsaPublicKey)
    err = f.Close()

保存したDER形式のRSA公開鍵をOpenSSLコマンドで確認する

openssl rsa -text -RSAPublicKey_in -inform der -in derFormatRsaPublic.key

PEM形式で保存する

    f, err = os.Create("pemFormatRsaPublic.key")
    err = pem.Encode(f, &pem.Block{Type: "RSA PUBLIC KEY", Bytes: derRsaPublicKey})
    err = f.Close()

保存したPEM形式のRSA公開鍵をOpenSSLコマンドで確認する

openssl rsa -text -RSAPublicKey_in -in pemFormatRsaPublic.key

4. GolangでSubjectPublicKeyInfo作成

あんまり需要はないきがしますが…

SubjectPublicKeyInfo作成

    //[RFC5280]
    publicKeyInfo, err := x509.MarshalPKIXPublicKey(rsaPublicKey)

DER形式で保存する

    //拡張子は適当
    f, err = os.Create("subjectPublicKeyInfo.der")
    _, err = f.Write(publicKeyInfo)
    err = f.Close()

PEM形式で保存する

    //拡張子は適当
    f, err = os.Create("subjectPublicKeyInfo.pem")
    err = pem.Encode(f, &pem.Block{Type: "PUBLIC KEY", Bytes: publicKeyInfo})
    err = f.Close()

保存したPEM形式のSubjectPublicKeyInfoをOpenSSLコマンドで確認する

RFC 5280に定義されたSubjectPublicKeyInfoの構造

   SubjectPublicKeyInfo  ::=  SEQUENCE  {
        algorithm            AlgorithmIdentifier,
        subjectPublicKey     BIT STRING  }

   AlgorithmIdentifier  ::=  SEQUENCE  {
        algorithm               OBJECT IDENTIFIER,
        parameters              ANY DEFINED BY algorithm OPTIONAL  }

OpenSSLのasn1parseで中身を表示

openssl asn1parse -in subjectPublicKeyInfo.pem
    0:d=0  hl=4 l= 290 cons: SEQUENCE
    4:d=1  hl=2 l=  13 cons: SEQUENCE
    6:d=2  hl=2 l=   9 prim: OBJECT            :rsaEncryption
   17:d=2  hl=2 l=   0 prim: NULL
   19:d=1  hl=4 l= 271 prim: BIT STRING

5. GolangでPrivateKeyInfo作成

PrivateKeyInfo作成

    //PKCS#8 format RSA PrivateKey [RFC5208]
    privateKeyInfo, err := x509.MarshalPKCS8PrivateKey(rsaPrivateKey)

DER形式で保存する

    //拡張子は適当
    f, err = os.Create("privateKeyInfo.der")
    _, err = f.Write(privateKeyInfo)
    err = f.Close()

PEM形式で保存する

    //拡張子は適当
    f, err = os.Create("privateKeyInfo.pem")
    err = pem.Encode(f, &pem.Block{Type: "PRIVATE KEY", Bytes: privateKeyInfo})
    err = f.Close()

保存したPEM形式のPrivateKeyInfoをOpenSSLコマンドで確認する

RFC 5208に定義されたPrivateKeyInfoの構造

   PrivateKeyInfo ::= SEQUENCE {
        version                   Version,
        privateKeyAlgorithm       PrivateKeyAlgorithmIdentifier,
        privateKey                PrivateKey,
        attributes           [0]  IMPLICIT Attributes OPTIONAL }
   Version ::= INTEGER
   PrivateKeyAlgorithmIdentifier ::= AlgorithmIdentifier
   PrivateKey ::= OCTET STRING
   Attributes ::= SET OF Attribute

OpenSSLのasn1parseで中身を表示

$ openssl asn1parse -in privateKeyInfo.pem
    0:d=0  hl=4 l=1212 cons: SEQUENCE
    4:d=1  hl=2 l=   1 prim: INTEGER           :00
    7:d=1  hl=2 l=  13 cons: SEQUENCE
    9:d=2  hl=2 l=   9 prim: OBJECT            :rsaEncryption
   20:d=2  hl=2 l=   0 prim: NULL
   22:d=1  hl=4 l=1190 prim: OCTET STRING      [HEX DUMP]:308204A202 ~以下略~

6. コード

コードはこちら
https://github.com/tardevnull/gopkicookbook1

广告
将在 10 秒后关闭
bannerAds