这样生成的证书可以直接用于邮件 dkim 的 dns 记录. 我们最终使用的代码如下:
//生成密钥
func Create_PrivateKey_dkim_email() {
privateKey, err := rsa.GenerateKey(rand.Reader, 1024); //奇怪,这样生成的在 https://dkimcore.org/c/keycheck 中报不正确
//算了,以后再找原因吧,可能是 rsa 证书格式的种类问题,先用 https://dkimcore.org/tools/ 生成的好了
//This is a valid DKIM key record ,不对,好象是可以的
//privateKey, err := rsa.GenerateKey(rand.Reader, 512);
if err != nil {
////log.Fatal(err)
fmt.Println("1:", err);
}
//demo.PriKey = privateKey
//publicKey := privateKey.PublicKey;
//--------------------------------------------------
derStream := x509.MarshalPKCS1PrivateKey(privateKey);
block := &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: derStream,
}
file, err := os.Create("private.pem");
if err != nil {
//return err
fmt.Println("2:", err);
}
err = pem.Encode(file, block);
if err != nil {
//return err
fmt.Println("3:", err);
}
//--------------------------------------------------
// 生成公钥文件
publicKey := &privateKey.PublicKey
derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
if err != nil {
//return err
fmt.Println("4:", err);
}
block = &pem.Block{
Type: "PUBLIC KEY",
Bytes: derPkix,
}
file, err = os.Create("public.pem")
if err != nil {
//return err
fmt.Println("5:", err);
}
err = pem.Encode(file, block)
if err != nil {
//return err;
fmt.Println("6:", err);
}
}//