
正文
go语言签名验证 go 语言实战
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
为什么Go语言不支持重载?
上图是Golang官网FAQ的部分截图,看来关于Go不支持重载的这个问题困扰了很多从面向对象语言转到Go的开发者。官方在这里做出了解答。
在上面的回答中有这样一句话:
其意思是: 使用其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。
接下来又说: 在Go的类型系统中,仅按名称进行匹配并要求类型一致是一个简化的主要决定。
最后一句话: 关于操作员重载,似乎比绝对要求更方便。 同样,没有它,事情会变得更简单。
整个的解答非常漂亮、简洁。我们看完之后就会理解,Go语言的设计者之所以没有在Go中实现方法的重载,并没有复杂的理由,核心原则就是: 让Go保持足够的简单。 这也能看出来Go语言的设计者有着极大的选择和克制。
其实,笔者认为重载在本质上并没有很大的实际意义。只是表现力和表现形式上有一定的差别。明确某个上下文中的函数调用的关键就是函数签名,支持重载的语言中一般是函数名加函数参数构成函数签名。而Go中可以认为函数名就是签名。逻辑上没有太大的区别,就是把工作做在了台前 还是幕后的区别。
当然如果非要较真的话,我们或许可以在Go中声明方法的时候将参数写成 interface{} 或者 ... 切片的方式。在传进来参数的时候做一步校验,判断参数的类型和个数,然后分别处理之。
仁者见仁智者见智,大家有什么不同的理解欢迎一起沟通。
相关问答
Q1: Go 实现 TLS 双向认证
将会在 config 文件夹中生成 ca.key 和 ca.crt 文件
将会在 config 文件夹中生成 server.key 、 server.csr 和 server.crt 文件
签名方式: SHA-256 ,默认的 SHA-1 签名算法安全性不够高,Go 中会出现警告。
将会在 config 文件夹中生成 client.key 、 client.csr 和 client.crt 文件
签名方式: SHA-256 ,默认的 SHA-1 签名算法安全性不够高,Go 中会出现警告。
wireshark 截图如下:
Q2: 通过Go语言创建CA与签发证书
本篇文章中,将描述如何使用go创建CA,并使用CA签署证书。在使用openssl创建证书时,遵循的步骤是 创建秘钥 创建CA 生成要颁发证书的秘钥 使用CA签发证书。这种步骤,那么我们现在就来尝试下。
首先,会从将从创建 CA 开始。 CA 会被用来签署其他证书
接下来需要对证书生成公钥和私钥
然后生成证书:
我们看到的证书内容是PEM编码后的,现在 caBytes 我们有了生成的证书,我们将其进行 PEM 编码以供以后使用:
证书的 x509.Certificate 与CA的 x509.Certificate 属性有稍微不同,需要进行一些修改
为该证书创建私钥和公钥:
有了上述的内容后,可以创建证书并用CA进行签名
要保存成证书格式需要做PEM编码
创建一个 ca.go 里面是创建ca和颁发证书的逻辑
如果需要使用的话,可以引用这些函数
panic: x509: unsupported public key type: rsa.PublicKey
这里是因为 x509.CreateCertificate 的参数 privatekey 需要传入引用变量,而传入的是一个普通变量
extendedKeyUsage :增强型密钥用法(参见"new_oids"字段):服务器身份验证、客户端身份验证、时间戳。
keyUsage : 密钥用法,防否认(nonRepudiation)、数字签名(digitalSignature)、密钥加密(keyEncipherment)。
文章来自
Q3: 如何验证证书链的签出关系
如何验证证书链的签出关系
在证书链中go语言签名验证,通常由根CA证书,签出中间CA证书,再签出服务证书。这是一个签出链关系:
Root CA - Intermediate CA1 - Intermediate CA2 - ... Intermediate CAn - Server Certificate
那么如何验证谁是谁的签出关系呢,意思就是验证一个证书是由谁签发的。
通常我们拿到一个完整服务端证书的时候会包含:
ca-chain.pem里面可能包含多个CA证书,如何找到直接签出那个CA证书呢。
我们查看证书的一般内容:
有几个信息:
这里Issuer就明确表明go语言签名验证了当前证书是由谁签发的,那我们去找ca-chain里面的所有证书,挨个遍历找出其Subject和这个一样,那么就说明是签发证书。
理论上是这样的,但是Subject只是包含文本信息,用户可以篡改伪造,只要是同名Subject就可以啦。所以这个字段只是便于肉眼辨识使用,真正使用验证的是signature信息。
在前面证书内容中,最后我们看到有Signature Algorithm域,它的值就是签出证书的signature,这个签名是根据签出证书的内容生成的,只有签出证书本身才能得出这个signature。所以我们需要对照CA证书,生成他的signature值,然后和服务端证书里的这个域值进行比较,如果相当就说明是签出证书。
这个算法比较复杂,不细究go语言签名验证了,golang里面提供了函数可以直接调用:
func (c *Certificate) CheckSignatureFrom(parent *Certificate) error
举例:
输入:go build test.go ./test cert.pem ca.pem
验证ca.pem是不是cert.pem的直接签出证书。
还有一个办法是使用: func ( Certificate) Verify() 函数。
如果verify成功,在返回的chains [][] Certificate中每一列的:
go语言签名验证的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于go 语言实战、go语言签名验证的信息别忘了在本站进行查找喔。






