美文网首页
自签名证书生成

自签名证书生成

作者: Ballpenww | 来源:发表于2022-08-30 15:08 被阅读0次

注意点

  • 证书有效期:如果没有安全强要求,建议配置长一些,比如50年
  • csr中的hosts配置:
    • 一般要增加127.0.0.1,
    • 其次是当前集群的IP地址,
    • 最后要增加备份的节点域名,一般增加2个就够了,保证基数个节点
      • 这个域名只能是一对一的配置,不要一对多,如果解析到另外一个地址,会验证失败
      • 在做节点添加是要使用域名,比如etcdctl member add etcd04 --peer-urls="https://etcd_first.etcd.cluster.local:2380",并且在启动时也要用对应域名配置url,要不然raft votemsg会失败
  • 可以使用cfssl官方提供的TLDR的快速方式,但不建议,不好保留历史,后期做更新比较,其次容易不假思索直接复制,而不修改以上2点

cfssl 基本使用

参考:

  1. https://segmentfault.com/a/1190000038276488
  2. https://github.com/coreos/docs/blob/master/os/generate-self-signed-certificates.md
  3. https://github.com/cloudflare/cfssl

工具下载自己看官文吧,都比较简单。
工具说明:

  • cfssl: 用于签发证书;
  • cfssljson: 将cfssl签发生成的证书(json格式)变成文件承载式文件;
  • cfssl-certinfo: 验证查看证书信息。

ca-config.json文件介绍:

通过cfssl print-defaults config > ca-config.json生成配置CA选项,

{
    "signing": {
        "default": {
            "expiry": "438000h"
        },
        "profiles": {
            "www": {
                "expiry": "438000h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            },
            "client": {
                "expiry": "438000h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            }
        }
    }
}

其中:

  1. profile: 指定证书使用场景,下面的etcd-op是一个场景名称,后续签名生成证书及其私钥时需要指定该场景(profile)名称
  2. expiry: 配置过期时间,我一般都配置50年438000h
  3. signing:表示该证书可用于签名其它证书,生成的 ca.pem 证书中 CA=TRUE
  4. server auth:表示 client 可以用该该证书对 server 提供的证书进行验证
  5. client auth:表示 server 可以用该该证书对 client 提供的证书进行验证
  6. 在配置server和peer端证书时需要同时开启server authclient auth, 如上profile.server

CSR介绍

通过cfssl print-defaults csr > ca-csr.json生成

{
    "CN": "etcd_first",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "O": "etcd first",
            "ST": "Beijing",
            "OU": "system op"
        }
    ]
}

其中:

  1. CN: Common Name,所有的csr文件都必须有这个字段,对于ssl证书,一般为网站域名;对于代码签名证书则为申请单位名称,对于客户端证书为证书申请这名称
  2. hosts:网络请求url中合法主机名或域名集合,注意点:
    • 超过改集合范围的任何请求都不会被支持认证通过
    • CA根证书及其私钥创建过程不需要配置,其他证书必须配置
  3. key: 必须字段,配置加密算法,一般使用ras,密文长度2048
  4. name:必须字段,是证书对外公开显示的一些字段,如:
    • C: (Country)所在国家简称,只能是国家字母缩写,如中国:CN
    • L: (Locality) 所在地区/城市简称,如Beijing/San Francisco
    • ST: (State/Provice)所在州/省份简称,如Beijing/California
    • O: (Organization Name) 单位名称,对于 SSL 证书,一般为网站域名;而对于代码签名证书则为申请单位名称;而对于客户端单位证书则为证书申请者所在单位名称
    • OU: (other)显示其他内容,常见的内容值有“System"、"Website"等

CA配置和CSR搞定后,就可以开始生成证书了。

如果帮到您,辛苦点赞鼓励下!

根据ca-csr.json生成ca根证书及其私钥

命令:

cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

生成如下3个文件

$ ls
ca-key.pem   ca.csr  ca.pem

其中:

  1. ca.pem是CA根证书文件,ca-key.pem是其私钥文件
  2. 要妥善保留ca-key.pem文件,这个key允许在我们的CA中创建任何类型的证书

根据CA根证书及私钥签名生成其他证书及私钥

分为3步

创建ca根证书配置文件

对ca-config.json文件添加我们需要profile

{
    "signing": {
        "default": {
            "expiry": "438000h"
        },
        "profiles": {
            "server": {
                "expiry": "438000h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",   # 开启server auth
                    "client auth"
                ]
            },
            "client": {
                "expiry": "438000h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            }
        }
    }
}

创建目标证书签名请求文件

etcd集群证书配置
对于etcd的证书的hosts配置官方支持3种方式

  1. 纯IP方式:这种只有在集群开始时比较方便,比如一次构建5节点集群,后期也不计划扩容,节点异常也是原节点修复,这种是没问题。但集群变化和发展谁都无法预测,该方案后期更新成本太高,不建议
    "hosts": [
        "127.0.0.1",
        "IP1",
        "IP2",
        "IP3"
    ],
  1. IP+域名:IPs为启示集群节点,域名作后续节点容灾,推荐使用。但这有些注意点这个在后面会提到
    "hosts": [
        "127.0.0.1",
        "IP1",
        "IP2",
        "IP3",
        "etcd_first.etcd.cluster.local",  #做备份
        "etcd_second.etcd.cluster.local"   #做备份
    ],
  1. 纯域名:我这边测试没通过,可能是我打开方式不对,后期再研究下
  2. 自动生成证书:及使用--auto-tls,--peer-auto-tls等参数,但不建议,只做阐述加密,不做认证。如果要用,注意一下几点:
    • 默认有效期为1年,可以通过--self-signed-cert-validity修改,单位/年,eg: --self-signed-cert-validity 10则有效期为10年
    • 证书目录:${data_dir}/fixtures/{client,peer}, 在使用etcdctl连接时需要将client证书下发到client,使用--insecure-skip-tls-verify没什么用,报错'authentication handshake failed: x509: “etcd” certificate is not standards compliant',所以还需要带上证书访问

我们这里主要使用方式2(IP+域名),最终cat server-csr.json如下:

{
    "CN": "etcd_first",
    "hosts": [
        "127.0.0.1",
        "IP1",
        "IP2",
        "IP3",
        "etcd_first.etcd.cluster.local",  #做备份
        "etcd_second.etcd.cluster.local"   #做备份
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "O": "etcd first",
            "ST": "Beijing",
            "OU": "system op"
        }
    ]
}

根据ca根证书、私钥和csr 生成目标证书和私钥

命令:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server

生成如下3个文件

server-key.pem
server.csr
server.pem

以上是生成server端的证书方式,生成client的方式也一样,只要创建csr并制定命令即可

  1. 编辑client-csr.json
{
    "CN": "client",
    "hosts": [
        ""    # 配置为空,容许持有证书的任何来源访问
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Beijing",
            "O": "etcd first",
            "ST": "Beijing",
            "OU": "system op"
        }
    ]
}
  1. 生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client

会生成3个文件

client-key.pem
client.csr
client.pem

证书验证

使用cfssl certinfo -cert xx.pem既可以, 主要关注一下几点:CN、sans、not_after、names等字段
如下

$ cfssl certinfo -cert client.pem
{
  "subject": {
    "common_name": "client",
    "country": "CN",
    "organization": "etcd first",
    "organizational_unit": "system op",
    "locality": "Beijing",
    "province": "Beijing",
    "names": [
      "CN",
      "Beijing",
      "Beijing",
      "etcd first",
      "system op",
      "client"
    ]
  },
  "issuer": {
    "common_name": "etcd_first",
    "country": "CN",
    "organization": "etcd first",
    "organizational_unit": "system op",
    "locality": "Beijing",
    "province": "Beijing",
    "names": [
      "CN",
      "Beijing",
      "Beijing",
      "etcd first",
      "system op",
      "etcd_first"
    ]
  },
  "serial_number": "354570494792461617747523533652666508450742134446",
  "sans": [
    ""
  ],
  "not_before": "2022-08-29T07:21:00Z",
  "not_after": "2072-08-16T07:21:00Z",
  "sigalg": "SHA256WithRSA",
  "authority_key_id": "39:1:EE:42:23:D2:26:74:F7:65:5F:CA:9:C4:DD:A5:D0:23:CF:F9",
  "subject_key_id": "52:21:7:44:27:4D:BA:E8:D2:97:ED:7D:E5:45:5B:10:B4:C6:C3:A6",
  "pem": "-----BEGIN CERTIFICATE-----\nMIID7jCCAtagAwIBAgIUPht9qf30B8J2Uozkh+UqtY8X5q4wDQYJKoZIhvcNAQEL\nBQAwbzELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0JlaWppbmcxEDAOBgNVBAcTB0Jl\naWppbmcxEzARBgNVBAoTCmV0Y2QgZmlyc3QxEjAQBgNVBAsTCXN5c3RlbSBvcDET\nMBEGA1UEAwwKZXRjZF9maXJzdDAgFw0yMjA4MjkwNzIxMDBaGA8yMDcyMDgxNjA3\nMjEwMFowazELMAkGA1UEBhMCQ04xEDAOBgNVBAgTB0JlaWppbmcxEDAOBgNVBAcT\nB0JlaWppbmcxEzARBgNVBAoTCmV0Y2QgZmlyc3QxEjAQBgNVBAsTCXN5c3RlbSBv\ncDEPMA0GA1UEAxMGY2xpZW50MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\nAQEApM4aUmPAWE5E4Cd4hf3s1lL3Q+lneLNgLGHu1XRVYzDGoHbEgalfN2e/i1zm\ntJUvS2DlfNdfEfuOa2B1bNE+OilfkWqmRsXrAjjjt4xvfLFGChhD2tfqVVs8/3r3\nThIvMYf9iS29I5QDm0hrinD+xzpCwb0ibdiE9/ZlJ56NS6oY8NhlY7L2d97P22vt\n57WrIjuOO32X40iR8kTHxqf+q6YVSePoKHBF6rFtacHorAlPiDRNEzauvm2WnHC3\nQAFuLJ4LiLpEwf3fWOdqsVRDWswNGGxdP86ZdDwUUp16sVtz6H+XoeOq3xvkM+xn\nPMPJfNFJiFXDwXqhrIQ2EJ1JnwIDAQABo4GDMIGAMA4GA1UdDwEB/wQEAwIFoDAT\nBgNVHSUEDDAKBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBRSIQdE\nJ0266NKX7X3lRVsQtMbDpjAfBgNVHSMEGDAWgBQ5Ae5CI9ImdPdlX8oJxN2l0CPP\n+TALBgNVHREEBDACggAwDQYJKoZIhvcNAQELBQADggEBAHpCTApd59DTn6p0EXLC\nPHmtmufMIbdsZSfIQm6JqRARUHJy0WOwqkaE66yvsbDZYv8MUXZY20L8WT80PLgx\nXENJI66YtkJuGyxf3QCRYqvwfpLXTwxHNOhuU6VlNM0J5lxg99vCzXycSyhPYnpC\nQ1yr3BgIQHn9Y1l5v9j23kAKCLx/47XLnpDuDuCCmvNfbSU27/Hqm5GnRfWWt0v+\n5pY+mDZi+STsXCdYUlrm3fpCPurL97sS1gswYM/R28QIkDgNlYC80QZXPN9/ix4V\nVtcBt6/PgfEUgC10GTGNcr0IBPKHXh980UPsRG8pa6L5RkTA7kS6Nt877iz1SE3W\njtA=\n-----END CERTIFICATE-----\n"
}

相关文章

  • openssl生成EC类型证书

    生成EC KEY 生成CSR 生成自签名证书 或者使用CA证书来签名

  • 网络编程(11)HTTPS 请求

    一 生成自签名数字证书 说明:1> 什么是证书--->带签名的公钥(公钥+签名)2> 自签名证书的特点 --->...

  • 2019-03-05

    ubuntu 配置自签名数字证书开启https服务 1. 生成证书:自签名数字证书的生成跟MacOS一样,可以参见...

  • openssl shell辅助工具

    最近折腾自签名证书,研究了下生成根证书、服务端证书、颁发客户证书; 以及证书吊销;结合nginx实现自签名双向认证...

  • Android 使用自签名证书

    Android SSL可以使用CA证书也可以使用自签名证书,自签名证书是通过keystore生成的,本文介绍and...

  • 本地生成证书

    生成key 生成证书请求 自签名生成证书 具体参考 http://www.cnblogs.com/kyrios/p...

  • openSSL创建自签名证书

    创建二级CA 生成CA签名请求 创建CA同时生成签名请求 使用根CA签发二级CA 创建自签名证书-服务器证书 生成...

  • nginx 配置https

    编译nginx 生成自签名证书 修改nginx配置

  • 一键自签本地自签名SAN域名证书HTTPS工具(最新版Chrom

    一键自动生成本地自签名SAN域名证书工具 原生OpenSSL生成自签名SAN CA域名(V3签名),在Linux、...

  • 生成SSL自签证书

    生成一个自签名证书 下面的命令可以被用来产生一个自签名的证书。 首先,生成2048位的加密私钥 openssl g...

网友评论

      本文标题:自签名证书生成

      本文链接:https://www.haomeiwen.com/subject/tsilnrtx.html