专栏首页极客生活go 原生代码搞定https双向认证客户端私钥加密

go 原生代码搞定https双向认证客户端私钥加密

最近有一个https双向认证的项目,客户端的证书是加密的,之前用python requests 做原型测试发现不支持加密,需要运行的时候在终端输入密码。

当然一开始在网上搜索go也没有发现比较好的方案,基本都是通过openssl工具先在命令行把加密的key转换成非加密的,然后调用tls.LoadX509KeyPair()函数。

但是对于加密的的客户端证书,tls.LoadX509KeyPair()函数并没有提供一个密码参数来自动解密,所以没办法,只能自己摸索喽。

使用Go自然是相信go本身的强大,各种搜索然后结合相关的API文档后摸索出了直接通过go原生代码来解密的流程,不依赖任何第三发库和命令工具。

import (
    "crypto/tls"
    "crypto/x509"
    "encoding/pem"
    "io/ioutil"
    "net/http"
)

func InitHttpsClient(keyPem, certPem, pemPass string) *http.Client {
    // 读取私钥文件
    keyBytes, err := ioutil.ReadFile(keyPem)
    if err != nil {
        panic("Unable to read keyPem")
    }
    // 把字节流转成PEM结构
    block, rest := pem.Decode(keyBytes)
    if len(rest) > 0 {
        panic("Unable to decode keyBytes")
    }
    // 解密PEM
    der, err := x509.DecryptPEMBlock(block, []byte(pemPass))
    if err != nil {
        panic("Unable to decrypt pem block")
    }
    // 解析出其中的RSA 私钥
    key, err := x509.ParsePKCS1PrivateKey(der)
    if err != nil {
        panic("Unable to parse pem block")
    }
    // 编码成新的PEM 结构
    keyPEMBlock := pem.EncodeToMemory(
        &pem.Block{
            Type:  "RSA PRIVATE KEY",
            Bytes: x509.MarshalPKCS1PrivateKey(key),
        },
    )
    // 读取证书文件
    certPEMBlock, err := ioutil.ReadFile(certPem)
    if err != nil {
        panic("Unable to read certPem")
    }
    // 生成密钥对
    cert, err := tls.X509KeyPair(certPEMBlock, keyPEMBlock)
    if err != nil {
        panic("Unable to read privateKey")
    }

    client := &http.Client{
        Transport: &http.Transport{
            TLSClientConfig: &tls.Config{
                Certificates:       []tls.Certificate{cert},
                InsecureSkipVerify: true,
            },
        },
    }
    return client
}

剩下的就是http请求的老套路了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 最趁手的数据可视化工具Tableau

    作为一个数据分析从业者,不但要从杂七杂八的数据中提取有用的数据,而且还要生成漂亮的图表展示出来。

    有福
  • 数据分析Excel技能之移动某行

    单击第3行的「行标」选中第3行,把鼠标指向第3行的「下边缘」,当指针变为一个「小手」形状时,按住鼠标左键拖动鼠标便可以拖动第三行到某一个位置。

    有福
  • Mac下iTerm2 免密码登录

    iTerm2 本身并没有提供这个功能,不过可以借助第三方工具sshpass来实现。

    有福
  • python---简单的接口测试实例

    我们可以用Jmeter做接口测试,但是呢个人觉得那个有点局限性,用python就灵活很多,

    py3study
  • 分享WordPress显示评论者IP的归属地及运营商信息的2种方案

    张戈博客之前分享过一篇《WordPress 显示访客 UA 信息:Show UserAgent 纯代码轻度汉化版》的部署教程,算是满足了 WordPress 折...

    张戈
  • leetcode: 65. Valid Number [✗]

    JNingWei
  • Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置

    前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议...

    江南一点雨
  • 初学者|一起来学习pyltp

    本文简绍了pyltp的使用方法,它提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等等工作。

    AiTechYun
  • 讨论在 Linux Control Groups 中运行 Java 应用程序的暂停问题

    本篇原文来 LinkedIn 的 Zhenyun Zhuang,原文:Application Pauses When Running JVM Inside Li...

    涤生
  • 讨论在 Linux Control Groups 中运行 Java 应用程序的暂停问题

    本篇原文来自 LinkedIn 的 Zhenyun Zhuang,原文:Application Pauses When Running JVM Inside L...

    涤生

扫码关注云+社区

领取腾讯云代金券