我正在尝试获取 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 解析 DER 编码的公钥。这些值通常在带有“BEGIN PUBLIC KEY”的 PEM block 中找到
并且,在此函数的示例中使用 pem.Decode()。我对此很困惑,因为这应该使用 pem.Decode 或类似 der.Decode() 的东西?
此外,x509.ParsePKCS1PublicKey() 和 x509.ParsePKIXPublicKey() 之间的真正区别是什么?两者都做同样的工作来获得 rsa.PublicKey 吗?
最佳答案
这里的问题是了解 x509.ParsePKCS1PublicKey (PKCS#1) 和 x509.ParsePKIXPublicKey (PKCS#8) 之间的区别。
通常当 PEM header 的类型为 RSA PUBLIC KEY 时,它指的是 PKCS#1 编码的 RSA 公钥,它在 RFC 8017 (PKCS#1) 中定义为:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
您实际上并没有提供公钥的主体(这样做是安全的),但可以合理地假设,如果使用 x509.ParsePKIXPublicKey 解码 key 失败,您的 key 可能采用上述格式(x509.ParsePKIXPublicKey 使用 PKCS#8 编码)。
如果是这种情况,您应该能够使用以下代码从文件中获取 rsa.PublicKey(不要忘记添加错误处理):
rawPem, _ := ioutil.ReadFile("./public.key")
pemBlock, _ := pem.Decode(rawPem)
publicKey, _ := x509.ParsePKCS1PublicKey(pemBlock.Bytes)
如果这不能解决您的问题,请尝试将您拥有的 key 粘贴到 this site 中以查看它使用的 ASN.1 结构。作为引用,我用来测试它的 key 包含在这里:
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEApW1W9dnfdFF7FHrq6HPveR/9T+nM70yO7QOGytR0j/chMBJcJBjG
hJOuKPFbkVyS+BE/4M8CojLgvz4ex82Re0sFa5TqnoWvuP5P4vktR6M5W53sTW3y
gUnfF/oHcEmARQ1xKZdgVnlIfrdbpjecPyLi1Ng4HmhEfCFUOW64koxpb4XeH5O5
q+vc/731ExVOYBU8Sl6kPdjpJuVjS3DHKAVgfVEhscXd3JDjDuMDT3w1IYNb5c2s
wHE55q4Jnc1cr42jdynnkXzmuOGo2C6yD95kbBDLp7wSiBxaMA8gbRkzWJ99T+6l
KsKG2zfndMF3jZW1v1wWiEbYRN07qbN0NQIDAQAB
-----END RSA PUBLIC KEY-----
关于go - x509 Go 包 - ParsePKIXPublicKey 是 DER 还是 PEM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54769217/
我在思考流量控制的最佳实践。我应该走哪条路?1)不要检查任何东西并让程序失败(更清晰的代码,自然的错误消息):defself.fetch(feed_id)feed=Feed.find(feed_id)feed.fetchend2)通过返回nil静默失败(但是,“CleanCode”说,你永远不应该返回null):defself.fetch(feed_id)returnunlessfeed_idfeed=Feed.find(feed_id)returnunlessfeedfeed.fetchend3)抛出异常(因为不按id查找feed是异常的):defself.fetch(feed_id
eruby和erb有什么区别?哪些考虑因素会促使我选择其中之一?我的应用程序正在为网络设备(路由器、负载平衡器、防火墙等)生成配置文件。我的计划是对配置文件进行模板化,在源文件中使用嵌入式ruby(通过eruby或erb)来执行诸如迭代生成路由器的所有接口(interface)配置block之类的操作(这些block都非常相似,仅在标签上有所不同和IP地址)。例如,我可能有这样一个配置模板文件:hostnamesample-routerlogging10.5.16.26当通过嵌入式ruby解释器(erb或eruby)运行时,会产生以下输出:hostnamesample-rout
在Railcasts上,我注意到一个非常有趣的功能“转到符号”窗口。它像Command-T一样工作,但显示当前文件中可用的类和方法。如何在vim中获取它? 最佳答案 尝试:helptags有各种程序和脚本可以生成标记文件。此外,标记文件格式非常简单,因此很容易将sed(1)或类似的脚本组合在一起,无论您使用何种语言,它们都可以生成标记文件。轻松获取标记文件(除了下载生成器之外)的关键在于格式化样式而不是实际解析语法。 关于ruby-on-rails-Textmate'Gotosymbol
所以,我正在尝试RubyonRails指南的入门部分here.我不明白line在本教程中。引用它:Theparamsmethodistheobjectwhichrepresentstheparameters(orfields)cominginfromtheform.我以前确实有一些Rails方面的经验,而且我一直假设params是一个散列。但这里他们称之为方法,它是一个对象。params是方法还是哈希?还有,在ruby中,方法也是对象吗? 最佳答案 params是一个返回ActionController::Parameters对象的
Asitcurrentlystands,thisquestionisnotagoodfitforourQ&Aformat.Weexpectanswerstobesupportedbyfacts,references,orexpertise,butthisquestionwilllikelysolicitdebate,arguments,polling,orextendeddiscussion.Ifyoufeelthatthisquestioncanbeimprovedandpossiblyreopened,visitthehelpcenter提供指导。11年前关闭。我是一位精通HTML
考虑Ruby类Foo::Bar。惯例是将“Foo”命名空间作为一个模块,但它也可以很容易地作为一个类:moduleFoo;classBar;end;end对比:classFoo;classBar;end;end在第二种情况下,Bar不是Foo的内部类,它只是在Foo的单例上定义的另一个常量。在这两种情况下,父类(superclass)都是Object并且它们只包含Kernel模块。它们的祖先链是相同的。因此,除了您可以根据其类使用Foo进行的操作(如果是类则实例化,如果是模块则扩展/包含),命名空间的性质是否对有任何影响酒吧?是否有令人信服的理由选择其中一个名称间距而不是另一个?我看到
我正在创建一个Rails应用程序,它将使用相当多的外部API,例如SalesForce、FolderGrid(如Dropbox)等,它们都会同步到我的数据库。我从来没有使用过外部api调用,所以我创建了一些基本的Ruby脚本和分散的方法来测试对这些资源的调用。现在我想用我的完整Rails应用程序来实现它们。到目前为止,我首先在我的/lib文件夹中创建一个目录来保存api调用模块/类。/lib/apis/foldergrid.rb现在我不确定组织代码的最佳方法是什么。在我的独立Ruby脚本中,我有用于身份验证、创建文件夹、审核文件、下载文件等的方法。模块中应该包含什么?我什至需要一个模块
我对网络编程还很陌生(或者实际上,对网络编程很陌生,因为我上次弄乱网络是HTML1.1),但现在需要快速部署网络应用程序。似乎每次我转身,都有新的首字母缩略词和技术需要学习(JSON、XMLRPC、GWT、Javascript、Rails等)。这是我的应用必须执行的操作:给定用户名和密码,进行身份验证(很简单,显然一切都这样做)。允许用户上传大量数据进行处理。处理该数据。允许用户下载他们处理过的数据。我已经有了用于处理数据的Java脚本和数据库。在一台机器上,我可以运行一系列命令行程序来处理传入的数据block并将结果放回mysql数据库。这已经存在并且有效。我想为这个任务构建一个网络
我有一个rubyonrails站点(rails2.0.2,ruby1.8.6)同时安装了rubyzip和zipruby,但是它们在File.exists上有冲突吗?方法所以我想删除一个。关于future最好的压缩API的普遍共识是什么?两者之间有明显的优势吗? 最佳答案 据我所知,rubyzip有时会奇怪地处理zip文件,因为它自己处理zip文件索引和记录。例如,如果您使用rubyzip解压一个docx文件并重新打包,MicrosoftWord将无法打开它。但是zipruby使用非常标准的libzipC库(带有轻微的定制
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我使用PHP的时间太长了,对它感到厌倦了。我也想学习一门新语言。我一直在使用Ruby并且喜欢它。我必须在Rails和Sinatra之间做出选择,那么您会推荐哪一个?Sinatra真的不能用来构建复杂的应用程序,它只能用于简单的应用程序吗?