博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用openssl演练数字签名
阅读量:5924 次
发布时间:2019-06-19

本文共 2106 字,大约阅读时间需要 7 分钟。

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

 

package main

import (

    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {

    resp, err := http.Get()
    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
参考:
 

转载于:https://www.cnblogs.com/charlieroro/p/8482462.html

你可能感兴趣的文章
The Distinguish of the share or static lib in MFC
查看>>
如何导出数据库的数据词典
查看>>
linux下内存释放问题
查看>>
让Java和JavaScript进行交互
查看>>
android 上传文件
查看>>
linux逻辑卷管理
查看>>
java结合testng,利用mysql数据库做数据源的数据驱动实例
查看>>
LINQ之路12:LINQ Operators之数据转换(Projecting)
查看>>
SQL Server:数据库角色
查看>>
分享8个超棒的基于HTML5和jQuery的开发教程
查看>>
JFreeChart开发_用JFreeChart增强JSP报表的用户体验
查看>>
SpringMVC+Swagger详细整合
查看>>
计算机视觉领域最全汇总(第2部分)
查看>>
走进webpack(2)--第三方框架(类库)的引入及抽离
查看>>
[译] 所有你需要知道的关于完全理解 Node.js 事件循环及其度量
查看>>
脚本监控网络状态,输出日志并归档(V2)
查看>>
(六十九)复合语句
查看>>
Cisco ASA 5505配置详解
查看>>
我的友情链接
查看>>
java读取某个文件夹下的所有文件
查看>>