apns に go から接続する

apns には前書いた APNs Provider API と昔からある Binary Provider API というのがある。

どちらも tls で接続する必要がある。 前者の場合は net/httpTransportTLSClientConfigtls.Config を指定する。 後者の場合は crypto/tls の Dial 関数に tls.Config を渡す。

developer center から証明書をダウンロードしてキーチェーンから .p12 で書き出してそれをそのまま使う場合は golang.org/x/crypto/pkcs12 を使って

       cert := tls.Certificate{}
        b, err := ioutil.ReadFile(*p12File)
        if err != nil {
            return cert, err
        }
        key, cer, err := pkcs12.Decode(b, *p12Password)
        if err != nil {
            return cert, err
        }
        cert.PrivateKey = key
        cert.Certificate = [][]byte{cer.Raw}

こんな感じ tls.Certificate を作る。

openssl とかで証明書と秘密鍵を取り出してる場合は

return tls.LoadX509KeyPair(*cerFile, *keyFile)

こんな感じで書く。