自签名证书生成
2022-08-30 本文已影响0人
Ballpenww
注意点
- 证书有效期:如果没有安全强要求,建议配置长一些,比如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 基本使用
参考:
- https://segmentfault.com/a/1190000038276488
- https://github.com/coreos/docs/blob/master/os/generate-self-signed-certificates.md
- 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"
]
}
}
}
}
其中:
- profile: 指定证书使用场景,下面的etcd-op是一个场景名称,后续签名生成证书及其私钥时需要指定该场景(profile)名称
- expiry: 配置过期时间,我一般都配置50年438000h
- signing:表示该证书可用于签名其它证书,生成的 ca.pem 证书中 CA=TRUE
- server auth:表示 client 可以用该该证书对 server 提供的证书进行验证
- client auth:表示 server 可以用该该证书对 client 提供的证书进行验证
- 在配置server和peer端证书时需要同时开启
server auth
和client 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"
}
]
}
其中:
- CN: Common Name,所有的csr文件都必须有这个字段,对于ssl证书,一般为网站域名;对于代码签名证书则为申请单位名称,对于客户端证书为证书申请这名称
- hosts:网络请求url中合法主机名或域名集合,注意点:
- 超过改集合范围的任何请求都不会被支持认证通过
- CA根证书及其私钥创建过程不需要配置,其他证书必须配置
- key: 必须字段,配置加密算法,一般使用ras,密文长度2048
- 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
其中:
- ca.pem是CA根证书文件,ca-key.pem是其私钥文件
- 要妥善保留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种方式
- 纯IP方式:这种只有在集群开始时比较方便,比如一次构建5节点集群,后期也不计划扩容,节点异常也是原节点修复,这种是没问题。但集群变化和发展谁都无法预测,该方案后期更新成本太高,
不建议
"hosts": [
"127.0.0.1",
"IP1",
"IP2",
"IP3"
],
- IP+域名:IPs为启示集群节点,域名作后续节点容灾,
推荐使用
。但这有些注意点这个在后面会提到
"hosts": [
"127.0.0.1",
"IP1",
"IP2",
"IP3",
"etcd_first.etcd.cluster.local", #做备份
"etcd_second.etcd.cluster.local" #做备份
],
- 纯域名:我这边测试没通过,可能是我打开方式不对,后期再研究下
- 自动生成证书:及使用--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'
,所以还需要带上证书访问
- 默认有效期为1年,可以通过
我们这里主要使用方式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并制定命令即可
- 编辑client-csr.json
{
"CN": "client",
"hosts": [
"" # 配置为空,容许持有证书的任何来源访问
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"O": "etcd first",
"ST": "Beijing",
"OU": "system op"
}
]
}
- 生成证书
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"
}