如何在Go中验证RSA密钥的长度?

huangapple go评论71阅读模式
英文:

How to verify RSA key length in Go?

问题

我正在使用以下函数在Go中设置一个https服务器。

err := http.ListenAndServeTLS(":8080", key, cert, nil)
if err != nil {
    log.Fatal("error...")
}

其中,key和cert分别是自签名的密钥和证书文件。
我的问题是,为了安全起见,我需要验证自签名密钥的大小是否为2048位(或更多)。
在Go中,我如何安全而干净地检查这一点呢?

英文:

I'm setting up a https server in Go using the following function.

err := http.ListenAndServeTLS(":8080", key, cert, nil)
if err != nil {
    log.Fatal("error...")
}

Where key and cert are respectively self-signed key and certificate files.
My problem is that for security I need to validate they self-signed key to have a 2048 bits size (or more).
How can I securely and cleanly check for this in Go?

答案1

得分: 4

package main

import (
	"crypto/ecdsa"
	"crypto/rsa"
	"crypto/tls"
	"log"
	"net/http"
)

func main() {
	certFile := "/tmp/cert.pem"
	keyFile := "/tmp/key.pem"

	cert, err := tls.LoadX509KeyPair(certFile, keyFile)
	if err != nil {
		log.Fatal(err)
	}

	var bitLen int
	switch privKey := cert.PrivateKey.(type) {
	case *rsa.PrivateKey:
		bitLen = privKey.N.BitLen()
	case *ecdsa.PrivateKey:
		bitLen = privKey.Curve.Params().BitSize
	default:
		log.Fatal("unsupported private key")
	}

	if bitLen < 2048 {
		log.Fatalf("private key length is too small (size: %d)\n", bitLen)
	}

	tlsConfig := tls.Config{
		Certificates: []tls.Certificate{cert},
	}

	server := http.Server{
		Addr:      ":8080",
		TLSConfig: &tlsConfig,
	}
	if err := server.ListenAndServeTLS("", ""); err != nil {
		log.Fatal(err)
	}
}

这是一个使用 Go 语言编写的服务器代码,它使用 TLS 加密协议来提供安全的通信。代码中加载了一个 X.509 证书和私钥对,并根据私钥的类型判断其长度是否满足要求(至少为 2048 位)。然后,创建了一个 TLS 配置,并使用该配置启动了一个监听在 8080 端口的 HTTPS 服务器。

英文:
package main

import (
	&quot;crypto/ecdsa&quot;
	&quot;crypto/rsa&quot;
	&quot;crypto/tls&quot;
	&quot;log&quot;
	&quot;net/http&quot;
)

func main() {
	certFile := &quot;/tmp/cert.pem&quot;
	keyFile := &quot;/tmp/key.pem&quot;

	cert, err := tls.LoadX509KeyPair(certFile, keyFile)
	if err != nil {
		log.Fatal(err)
	}

	var bitLen int
	switch privKey := cert.PrivateKey.(type) {
	case *rsa.PrivateKey:
		bitLen = privKey.N.BitLen()
	case *ecdsa.PrivateKey:
		bitLen = privKey.Curve.Params().BitSize
	default:
		log.Fatal(&quot;unsupported private key&quot;)
	}

	if bitLen &lt; 2048 {
		log.Fatalf(&quot;private key length is too small (size: %d)\n&quot;, bitLen)
	}

	tlsConfig := tls.Config{
		Certificates: []tls.Certificate{cert},
	}

	server := http.Server{
		Addr:      &quot;:8080&quot;,
		TLSConfig: &amp;tlsConfig,
	}
	if err := server.ListenAndServeTLS(&quot;&quot;, &quot;&quot;); err != nil {
		log.Fatal(err)
	}
}

huangapple
  • 本文由 发表于 2017年3月10日 07:16:26
  • 转载请务必保留本文链接:https://go.coder-hub.com/42707353.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定