zoukankan      html  css  js  c++  java
  • 使用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实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 Cowboys
    Java实现 蓝桥杯 算法训练 Cowboys
    55. Jump Game
    54. Spiral Matrix
    50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/charlieroro/p/8482462.html
Copyright © 2011-2022 走看看