x509 Go 包 - ParsePKIXPublicKey 是 DER 还是 PEM?

2024-01-21

我正在尝试获取 rsa.PublicKey 的对象,并且执行了以下步骤:

 ----BEGIN RSA PUBLIC KEY----
           ....
 ----END RSA PUBLIC KEY----
package main

import (
   "crypto/rand"
   "crypto/rsa"
   "crypto/x509"
   "encoding/pem"
   "fmt"
   "io/ioutil"
)

func main() {

 key, err := ioutil.ReadFile("./new_public.pem")
 if err != nil {
    fmt.Println(err.Error())
 }

 block, _ := pem.Decode([]byte(key))
 if block == nil {
    fmt.Println("unable to decode publicKey to request")
 }

 pub, err := x509.ParsePKIXPublicKey(block.Bytes)
 if err != nil {
     panic("failed to parse RSA encoded  public key" + err.Error())
 }

 switch pub := pub.(type) {
 case *rsa.PublicKey:
     fmt.Println("pub is of type RSA:", pub)
 default:
     panic("error")
 }

}

在此之后,当我尝试x509.ParsePKIXPublicKey(block.Bytes)我收到错误:

panic: failed to parse RSA encoded  public keyasn1: 
structure error: tags don't match (16 vs {class:0 tag:2 length:129 isCompound:false}) 
{
 optional:false 
 explicit:false 
 application:false 
 private:false 
 defaultValue:<nil> tag:<nil> 
 stringType:0 
 timeType:0 
 set:false 
 omitEmpty:false
} AlgorithmIdentifier @3

因此,我阅读了一些有关 DER 和 PEM 格式的博客和文档,它们是对证书进​​行编码的不同方式,基本上一种使用 base64,另一种仅使用字节。

在x509的Golang包中,x509.ParsePKIXPublicKey说:

ParsePKIXPublicKey parses a DER-encoded public key. These values are typically found in PEM blocks with "BEGIN PUBLIC KEY"

并且,在此函数的示例中使用 pem.Decode()。我对此很困惑,因为这应该使用pem.Decode或者类似的东西der.Decode() ?

另外,两者之间的真正区别是什么x509.ParsePKCS1PublicKey() and x509.ParsePKIXPublicKey()?两者都做同样的工作来获取 rsa.PublicKey 吗?


这里的问题是理解之间的区别x509.ParsePKCS1PublicKey(PKCS#1)和x509.ParsePKIXPublicKey(PKCS#8)。

通常当 PEM 标头的类型为RSA PUBLIC KEY,它指的是 PKCS#1 编码的 RSA 公钥,其定义在RFC 8017 (PKCS#1) https://www.rfc-editor.org/rfc/rfc8017#appendix-A.1.1 as:

RSAPublicKey ::= SEQUENCE {
     modulus           INTEGER,  -- n
     publicExponent    INTEGER   -- e
 }

您实际上尚未提供公钥的正文(这样做是安全的),但这是一个公平的假设,如果使用x509.ParsePKIXPublicKey失败,您的密钥可能采用上述格式(x509.ParsePKIXPublicKey使用 PKCS#8 编码)。

如果是这种情况,您应该能够获得rsa.PublicKey使用以下代码从文件中(不要忘记添加错误处理):

rawPem, _ := ioutil.ReadFile("./public.key")
pemBlock, _ := pem.Decode(rawPem)
publicKey, _ := x509.ParsePKCS1PublicKey(pemBlock.Bytes)

如果这不能解决您的问题,请尝试将您的密钥粘贴到这个网站 https://lapo.it/asn1js/看看它使用什么 ASN.1 结构。作为参考,我用来测试这个的密钥包含在这里:

-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEApW1W9dnfdFF7FHrq6HPveR/9T+nM70yO7QOGytR0j/chMBJcJBjG
hJOuKPFbkVyS+BE/4M8CojLgvz4ex82Re0sFa5TqnoWvuP5P4vktR6M5W53sTW3y
gUnfF/oHcEmARQ1xKZdgVnlIfrdbpjecPyLi1Ng4HmhEfCFUOW64koxpb4XeH5O5
q+vc/731ExVOYBU8Sl6kPdjpJuVjS3DHKAVgfVEhscXd3JDjDuMDT3w1IYNb5c2s
wHE55q4Jnc1cr42jdynnkXzmuOGo2C6yD95kbBDLp7wSiBxaMA8gbRkzWJ99T+6l
KsKG2zfndMF3jZW1v1wWiEbYRN07qbN0NQIDAQAB
-----END RSA PUBLIC KEY-----
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x509 Go 包 - ParsePKIXPublicKey 是 DER 还是 PEM? 的相关文章

  • 如何使信号量超时

    Go 中的信号量是通过通道来实现的 一个例子是这样的 https sites google com site gopatterns concurrency semaphores https sites google com site gop
  • “go.tools”的权限被拒绝错误

    当我尝试安装 go 工具时 我的权限被拒绝 usr local go pkg tool linux amd64 cover 我可以接受 因为它是 usr local 目录及需求root使用权 但我的第一个疑问是为什么当我设置时它试图安装在这
  • Golang:带有 JSON 负载的 http.NewRequest POST 返回错误 500

    我正在开发一个 API 库 有一个API端点 POST 当您发出curl命令时 它是 curl H X API TOKEN API TOKEN http interest graph getprismatic com text topic
  • 在 Visual Studio Code 中调试 Go 测试

    在我的 Windows 计算机上 我安装了 Visual Studio Code 要手动运行测试 我进入控制台到项目文件夹并输入 go test main test go 它工作完美 但我遇到一种情况 我需要调试我的测试以了解发生了什么 为
  • 是否可以在 C/C++ 中模仿 Go 接口?

    在 Go 中 如果类型具有接口定义的所有方法 则可以将其分配给该接口变量 而无需显式继承它 是否可以在 C C 中模仿此功能 是的 您可以使用纯抽象类 并使用模板类来包装 实现 抽象类的类型 以便它们扩展抽象类 这是一个简单的示例 incl
  • 解压文件的简单方法

    有没有一种简单的方法可以用 Go 解压文件 现在我的代码是 func Unzip src dest string error r err zip OpenReader src if err nil return err defer r Cl
  • golang无法启动调试,显示未找到框架CoreFoundation

    我使用的是 Macbook pro m1 在数据迁移或更新到 monterey 后 不确定是什么原因导致的 golang 似乎无法调试或 go list 编译 我尝试重新安装 更新 golang 结果是一样的 Go版本 1 17 3 dar
  • 有没有办法间歇性地执行重复性任务?

    有没有办法在 Go 中执行重复的后台任务 我在想类似的事情Timer schedule task delay period 在爪哇 我知道我可以用 goroutine 来做到这一点Time sleep 但我想要一些容易停止的东西 这是我得到
  • 关闭长度未知的通道

    当不了解频道时我无法关闭频道 length package main import fmt time func gen ch chan int var i int for time Sleep time Millisecond 10 ch
  • 如何拥有在标准输出上更新的就地字符串

    我想输出到标准输出并让输出 覆盖 以前的输出 例如 如果我输出On 1 10 我想要下一个输出On 2 10覆盖On 1 10 我怎样才能做到这一点 stdout是一个流 io Writer 您无法修改已写入其中的内容 什么can更改的是该
  • 关于编写惯用的 Golang 的建议

    我正在掌握 Golang 的做事方式 首先是一些示例代码 package main import log os func logIt s string f os OpenFile errors log os O RDWR os O CREA
  • “http:多个response.WriteHeader调用”有什么不好的影响?

    尽管我发现 http 多个响应 WriteHeader 调用 例外 但我的服务器表现良好 此异常不会导致我的服务器出现恐慌或行为异常 我进行了很多搜索 但只找到了如何解决这个问题 没有文档描述异常的不良影响 有人可以帮我找出为什么 http
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • Golang const unsafe.Sizeof

    不明白为什么我可以做到 const OK uint64 0 const OK int unsafe Sizeof uint64 0 但不是这个 const NOK binary Size uint64 0 它的解释在规格 https gol
  • 如何将长 Go 模板函数拆分为多行?

    我有一个很长的printf调用 Go 模板 例子 printf mongodb s s s s authSource admin replicaSet s readPreference nearest w majority Values r
  • 如何读取 UDP 连接直至超时?

    我需要读取 UDP 流量 直到超时 我可以通过在 UDPConn 上调用 SetDeadline 并循环直到出现 I O 超时错误来做到这一点 但这看起来很黑客 基于错误条件的流量控制 下面的代码片段看起来更正确 但并没有终止 在生产中 这
  • 如何通过在切片上查找来从切片复制到数组

    我正在编写一个库来处理二进制格式 我有一个带有数组变量的结构 我想保留它以用于文档目的 我还需要从输入字节片中查找和判断 一些伪代码 type foo struct boo 5 byte coo 3 byte func main input
  • 如何在golang中获得两个切片的交集?

    Go 中有没有有效的方法来获取两个切片的交集 我想避免嵌套 for 循环之类的解决方案slice1 string foo bar hello slice2 string foo bar intersection slice1 slice2
  • 重新设计循环依赖缺陷

    我有一堆小服务 它们共享一些常见的包 例如Logger Configuration and Net 我在单独的项目中编写了每个包 问题是我的Logger需求包Configuration用于设置 和我的Configuration not仅由L
  • 仅导出嵌入结构实现的方法子集

    是否可以仅导出嵌入结构实现的方法的子集 这是一种与减少代码复制和粘贴非常不同的方法吗 还有更惯用的方法吗 type A struct func a A Hello fmt Println Hello func a A World fmt P

随机推荐

  • 通过 Rest API 以 csv 格式导出 PowerBI 报告

    PowerBI 仅为分页报表提供了 CSV 格式导出 API 不适用于通过导出 API 仅支持 pbix ppt png 格式的普通报表 参考 https learn microsoft com en us rest api power b
  • 无法使用 Node.js 连接到 Apache ActiveMQ

    背景 尝试使用 AMQP 1 0 协议通过以下方式连接到我的 Apache ActiveMQ 代理amqp10 https www npmjs com package amqp10 我使用以下代码 改编自自述文件中的原始示例 const A
  • pyplot savefig 分配太多块

    我试图绘制一个包含数百万个三角形的图形 但 matplotlib 似乎无法处理它 当我尝试使用保存图形时savefig file png dpi 100 我收到以下错误 OverflowError Allocated too many bl
  • 使用 Command-Click 声明时,Xcode 11 (11A420a) 不显示“嵌入 H/VStack”菜单项

    我一直在使用 SwiftUI 我注意到所有这些教程都提到了 Command ClickText例如 并期望出现以下菜单项 以便嵌入HStack例如 问题是我没有看到这些 嵌入H VStack出现菜单项 即使我搜索 嵌入 它也不会返回任何内容
  • 重复事件、SQL 查询

    我知道有关重复事件的问题很常见 但除了与日历应用程序有关的事件之外 我还无法找到有关重复事件的特定问题的答案 主要区别在于我们应用程序中的事件 只能在报告中或单独出现 而不是以日历格式出现 尽管它们在很多方面非常相似 也许只是与日历相关的包
  • 如何在sql server中执行另一个存储过程中的存储过程

    我正在 sql server 2008 上工作 我有一个存储过程 在其中我正在执行另一个 usp 这里我想获取第二个usp的输出并相应地返回主usp输出参数 但我的主要 USP 总是返回第二个 USP 值和主要 USP 值 但我只想返回主要
  • Python subprocess.Popen 作为 Windows 上的不同用户

    在 Windows 上的 Python 中以不同用户身份启动子进程的最佳方式是什么 最好是 XP 及更高版本 但如果它只能在 Vista 和 7 上运行 我也可以接受 我不确定你是否可以使用标准 python 库来做到这一点 但是 那pyw
  • 打印 Python 函数参数的名称和值

    我想做一个debug print 它将输出调用者变量和值 稍后我会将其扩展为仅部分打印列表和字典等 这篇文章仅关注打印调用者变量和值的第一部分 这篇文章有以下几个部分 当前版本debug print 构建的测试用例 测试用例的输出 我想要的
  • Symfony 多次渲染同一个表单

    我想多次渲染同一个表单为两个不同的选项卡处理相同的操作 问题是 当我尝试时 仅显示第一个选项卡的形式 如果我更改id and name的形式 我发现这是 symfony 的预期行为 但我仍然需要它才能工作 我发现它可能适用于集合 但不知道它
  • 如何在一个Makefile中生成多个可执行文件?

    我的目录包含2源文件 a c and b c 我想生成可执行文件a from a c and b from b c 现在我只能想出一种写Makefile的方法 all gcc o a a c gcc o b b c 看起来有点尴尬 有更好的
  • Shopify API 如何使用 like 进行搜索查询

    嘿伙计们 我尝试做一些搜索功能 但使用 shopifyAPI gem 是不可能的 ShopifyAPI Product find all conditions title LIKE search params limit 20 page 1
  • 使用正则表达式从字符串中删除数字

    我正在尝试从字符串中删除未附加到单词的所有数字 例子 python 3 gt python python3 gt python3 1something gt 1something 2 gt 434 gt python 35 gt pytho
  • Rails 3:如何使用 Rails 在数据库中插入记录

    我是 Rails 新手 我正在尝试学习这项技术 所以如果问题很愚蠢 请原谅 我正在使用 Rails 3 请让我知道如何在数据库中插入记录 我正在使用 postgresql 下面是学生表的表结构 SELECT column name FROM
  • 如何启用 mongodb cli 漂亮打印? - db.col.find().pretty() 不工作

    使用 mongo v2 4 5 shell db col find pretty 在 osx 控制台或 linux ubuntu 12 04 bash 上都不能很好地打印 使用和不使用 Pretty 的输出没有差异 gt db people
  • 使用 C# 填充引导下拉列表

    如何从代码隐藏填充引导下拉列表 现在我正在尝试这个 HtmlGenericControl li for int x 3 x lt 10 x li new HtmlGenericControl li li Attributes Add cla
  • 在 TypeScript 中将 JSON 文件导入为 const

    我想从数组元素的属性创建一个联合类型 如果数组是内联的 那么使用常量断言就非常简单 const arr name One name Two as const type name typeof arr number name name One
  • ply lexmatch 正则表达式与通常的 re 有不同的组

    我正在使用 ply 并注意到存储在 t lex lexmatch 中的令牌 re 匹配与 re 模块以通常方式定义的 sre pattern 之间存在奇怪的差异 组 x 似乎偏离了 1 我定义了一个简单的词法分析器来说明我所看到的行为 im
  • 查找邮政编码指定距离内的所有邮政编码

    我知道这个问题听起来像是这里几个问题的重复 但这些问题都没有回答我想要的 我有兴趣知道是否有人知道如何在指定邮政编码的半径内找到其他邮政编码 我有带有纬度和经度的邮政编码数据库 但我不知道如何在 VB net 中执行此操作 例如 90069
  • WebAPI 混合隐式流程和客户端凭证流程

    我有一个 WebAPI 解决方案 可以通过 Authorize 属性保护其控制器方法 它验证给定用户是否具有适当的角色 这些角色基本上是来自 IdentityServer3 的声明 有多个单页应用程序客户端与此 WebAPI 交互 并且使用
  • x509 Go 包 - ParsePKIXPublicKey 是 DER 还是 PEM?

    我正在尝试获取 rsa PublicKey 的对象 并且执行了以下步骤 BEGIN RSA PUBLIC KEY END RSA PUBLIC KEY package main import crypto rand crypto rsa c