• 使用openssl演练数字签名


    以下代码摘自网上,设置一个server和client,client代码如下:

    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
    )
    
    func main() {
        resp, err := http.Get("https://localhost:8081")
        if err != nil {
            fmt.Println("error:", err)
            return
        }
        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
    }

    server代码如下:

    package main
    
    import (
        "crypto/tls"
        "crypto/x509"
        "fmt"
        "io/ioutil"
        "net/http"
    )
    
    func main() {
        pool := x509.NewCertPool()
        caCertPath := "ca.crt"
    
        caCrt, err := ioutil.ReadFile(caCertPath)
        if err != nil {
            fmt.Println("ReadFile err:", err)
            return
        }
        pool.AppendCertsFromPEM(caCrt)
    
        tr := &http.Transport{
            TLSClientConfig: &tls.Config{RootCAs: pool},
        }
        client := &http.Client{Transport: tr}
        resp, err := client.Get("https://localhost:8081")
        if err != nil {
            fmt.Println("Get error:", err)
            return
        }
        defer resp.Body.Close()
        body, err := ioutil.ReadAll(resp.Body)
        fmt.Println(string(body))
    }

     生成密钥和数字签名方式如下:

    • openssl genrsa -out ca.key 2048       #生成CA私钥
    • openssl req -x509 -new -nodes -key ca.key -subj "/CN=charlie.com" -days 5000 -out ca.crt  #使用CA私钥生成CA公钥
    • openssl genrsa -out server.key 2048    #生成server端私钥
    • openssl req -new -key server.key -subj "/CN=charlie.com" -out server.csr    #生成签名请求
    • openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 5000    #生成CA签名的server端数字签名

    注意:-subj subj选项表示证书拥有者的信息值,取代证书请求文件中的申请者的信息值。/cn必须是服务端的域名,使用IP可能会报如下错误,可以使用修改/etc/hosts的方式做域名映射

    如谷歌的subj内容为:



    server执行如下:

    client执行如下:

    可以使用如下方式验证证书有效性:

    1.openssl s_server -msg -verify -tls1_2 -state -cert cert.cer -key ..privkey -accept 18444

    使用上面的命令开启一个ssl测试服务器

    2.openssl s_client -msg -verify -tls1_2  -state -showcerts -cert cert.cer -key ..privkey -connect localhost:18444

    使用这个命令连接ssl测试服务器,如果连接成功会打印出证书和私钥的信息,然后输入任何字符都会在服务器端echo出来。

     
    查看CA的数字证书,可以看到CA为自签发的,签发者和使用者是同一人,此外在数字签名文件中可以看到CA的公钥信息,使用该公钥后续可以验证CA签发的文件的正确性

    再看下server端的数字证书,该数字证书经过charlie1.com的CA签发,可以看到签发者和使用者不一样。该证书中包含了server的公钥,用来后续与client端tls协商使用


    以上信息也可以在windows的证书中查看:
     
    本次生成的密钥和代码参见:https://files.cnblogs.com/files/charlieroro/%E5%8F%8C%E5%90%91%E8%AE%A4%E8%AF%81%E4%BB%A3%E7%A0%81%E5%92%8C%E8%AF%81%E4%B9%A6.rar
     
  • 相关阅读:
    解释器模式
    java-->Hashtable简单使用
    HashTable和HashMap区别
    享元模式
    Beanutils.copyProperties( )用法
    删除List集合中的元素方法
    Date中before和after方法的使用
    Spring定时任务@Scheduled注解使用方式
    Oracle中INSTR、SUBSTR和NVL的用法
    StringBuffer的delete方法与deleteCharAt方法的区别。
  • 原文地址:https://www.cnblogs.com/charlieroro/p/8482462.html
Copyright © 2020-2023  润新知