以下代码摘自网上,设置一个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
 

使用openssl演练数字签名的更多相关文章

  1. 第四周LINUX 学习笔记

    内核编译丶sed丶awk Linux:单内核    模块化:动态      /lib/modules      lsmod,modinfo,modprobe,insmod,,modprobe -r , ...

  2. Open SSL 开发环境配置

    Open SSL 开发环境配置 最后更新日期:2014-05-13 阅读前提:VisualStudio的基本使用.Cent OS的基本使用 环境: Windows 8.1 64bit英文版,Visua ...

  3. CryptoAPI与openssl数字签名与验证交互

    昨天写过了RSA非对称加密解密的交互方式, 其实数字签名也是RSA非对称加密,只不过用私钥加密的,再加上个hash摘要 CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDI ...

  4. PHP通过OpenSSL生成证书、密钥并且加密解密数据,以及公钥,私钥和数字签名的理解

    一.公钥加密假设一下,我找了两个数字,一个是1,一个是2.我喜欢2这个数字,就保留起来,不告诉你们(私钥),然后我告诉大家,1是我的公钥. 我有一个文件,不能让别人看,我就用1加密了.别人找到了这个文 ...

  5. openssl中RSA数字签名的使用

    参考: OpenSSL命令行工具验证数字签名 客户端需要生成一对密钥,服务器需要生成一对密钥,分别记为client_private.pem/client_public.pem和server_priva ...

  6. openssl dgst(生成和验证数字签名)

    openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 该伪命令是单向加密工具,用于生成文件的摘要信息,也可以进行数字签名,验证数字 ...

  7. (7) openssl dgst(生成和验证数字签名)

    该伪命令是单向加密工具,用于生成文件的摘要信息                  也可以进行数字签名,及验证数字签名. 首先要明白的是,数字签名的过程是计算出摘要信息,然后使用私钥对摘要信息进行加密得 ...

  8. 数字签名和数字证书等openssl加密基本术语

    openssl 算法基础 1.1 对称算法 : 密钥相同,加密解密使用同一密钥 1.2 摘要算法:无论用户输入的数据什么长度,输出的都是固定长度的密文:即信息摘要,可用于判断数据的完整性:目前常用的有 ...

  9. CryptAPI 数字签名 与 Openssl 验证签名

    这段时间要实现一个认证协议,分为客户端和服务器端,客户端使用windows操作系统,服务器端使用linux操作系统,在客户端下(windows),使用windows证书库中的签名证书对消息进行签名(使 ...

随机推荐

  1. mysql数据库基本使用(增删改查)

    数据库db,database 数据库:依照某种数据模型进行组织并存放到存储器的数据集合dbms,database management system 数据库管理系统:用来操作和管理数据库的大型服务软件 ...

  2. apue.h头文件(UNIX环境高级编程)

    在看UNIX环境高级编程是,碰到一个头文件"apue.h",搜一下别人的帖子,其实apue.h是作者自己写的一个文件,包含了常用的头文件,系统不自带.其中包含了常用的头文件,以及出 ...

  3. hi3531结构: VB_CONF_S

    定义视频缓存池属性结构体. typedef struct hiVB_CONF_S {        HI_U32 u32MaxPoolCnt; /* max count of pools, (0,VB ...

  4. FusionCharts MSBar3D图

    1.静态页面 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...

  5. javascript DOM document对象

    document对象代表整个html文档 用来访问页面所有元素最复杂的一个dom对象 也是window对象的一个子对象. 对于dom编程中,一个html就会当成一个dom树dom会把所有的html元素 ...

  6. Flex下拉框

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  7. 芝麻HTTP:Appium的安装

    Appium是移动端的自动化测试工具,类似于前面所说的Selenium,利用它可以驱动Android.iOS等设备完成自动化测试,比如模拟点击.滑动.输入等操作,其官方网站为:http://appiu ...

  8. filter()和find()的区别

    <div class="css"> <p class="rain">测试1</p> </div> <div ...

  9. Visual Studio2010重新安装后,冲突问题

    http://www.docin.com/p-685665064.html VS2010重装后出错解决办法 一般在卸载VS2010之后,也重新安装了一遍,有的时候可能会出现如下问题: 1. 未能正确加 ...

  10. 深度学习框架: Keras官方中文版文档正式发布

    今年 1 月 12 日,Keras 作者 François Chollet‏ 在推特上表示因为中文读者的广泛关注,他已经在 GitHub 上展开了一个 Keras 中文文档项目.而昨日,Françoi ...