资讯专栏INFORMATION COLUMN

证书签名工具 CFSSL

沈俭 / 3704人阅读

摘要:任何知道私钥的人都可以充当颁发证书。此密钥允许在中创建任何类型的证书。使用认证中心的私钥和证书签名生成机构的证书和私钥。将在任何机器上工作。它将简化证书例程,但会增加安全风险。

资源

https://blog.cloudflare.com/i... 官方博客

特性 概念 安装

下载安装

</>复制代码

  1. wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
  2. wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
  3. wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
  4. sudo cp cfssl_linux-amd64 /usr/local/bin/cfssl
  5. sudo cp cfssljson_linux-amd64 /usr/local/bin/cfssljson
  6. sudo cp cfssl-certinfo_linux-amd64 /usr/local/bin/cfssl-certinfo
  7. cd /usr/local/bin/
  8. chmod +x cfssl
  9. chmod +x cfssljson
  10. chmod +x cfssl-certinfo

初始化

</>复制代码

  1. mkdir ~/cfssl
  2. cd ~/cfssl
  3. cfssl print-defaults config > ca-config.json
  4. cfssl print-defaults csr > ca-csr.json

创建自己的内部服务使用的CA认证中心

运行认证中心需要一个CA证书和相应的私钥。后者是极其敏感的数据。任何知道私钥的人都可以充当CA颁发证书。因此,私钥的保护至关重要

</>复制代码

  1. #配置CA的证书生成策略
  2. cat << EOF > ca-config.json
  3. {
  4. "signing": {
  5. "default": {
  6. "expiry": "87600h"
  7. },
  8. "profiles": {
  9. "server": {
  10. "expiry": "87600h",
  11. "usages": [
  12. "signing",
  13. "key encipherment",
  14. "server auth"
  15. ]
  16. },
  17. "client": {
  18. "expiry": "87600h",
  19. "usages": [
  20. "signing",
  21. "key encipherment",
  22. "client auth"
  23. ]
  24. },
  25. "peer": {
  26. "expiry": "87600h",
  27. "usages": [
  28. "signing",
  29. "key encipherment",
  30. "server auth",
  31. "client auth"
  32. ]
  33. }
  34. }
  35. }
  36. }
  37. EOF
  38. ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile
  39. signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE
  40. server auth:服务端证书;表示client可以用该 CA 对server提供的证书进行验证;server 由服务器使用,并由客户端验证服务器身份
  41. client auth:客户端证书;表示server可以用该CA对client提供的证书进行验证;client用于通过服务器验证客户端。
  42. peer 对等证书;就是server auth、client auth都有的。成员之间共用,供它们彼此之间通信使用
  43. #生成CA的证书和私钥
  44. cat << EOF > ca-csr.json
  45. {
  46. "CN": "dudu_ca",
  47. "key": {
  48. "algo": "rsa",
  49. "size": 2048
  50. },
  51. "names": [
  52. {
  53. "C": "CN",
  54. "ST": "BeiJing",
  55. "L": "BeiJing",
  56. "O": "dudu_ca",
  57. "OU": "dudu_ca"
  58. }
  59. ]
  60. }
  61. EOF
  62. #生成运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名。
  63. #请保持ca-key.pem文件的安全。此密钥允许在CA中创建任何类型的证书。*.csr 文件在整个过程中不会使用
  64. cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  65. #生成如下文件
  66. ca.csr ca-key.pem ca.pem

生成kubernetes的证书。

证书最重要的价值是通用名称(CN)和主机(hosts)

最重要的部分是CN ,这应该是您的主机名和hosts阵列,它必须包含所有的:您的本地主机名、127.0.0.1、服务器的私有IP地址(不是其面向公众的IP)

</>复制代码

  1. #kubernetes服务的生成策略
  2. cat << EOF > kubernetes-csr.json
  3. {
  4. "CN": "kubernetes",
  5. "hosts": [
  6. "127.0.0.1",
  7. "10.29.167.233",
  8. "169.169.0.1",
  9. "kubernetes",
  10. "kubernetes.default",
  11. "kubernetes.default.svc",
  12. "kubernetes.default.svc.cluster",
  13. "kubernetes.default.svc.cluster.local"
  14. ],
  15. "key": {
  16. "algo": "rsa",
  17. "size": 2048
  18. },
  19. "names": [
  20. {
  21. "C": "CN",
  22. "ST": "BeiJing",
  23. "L": "BeiJing",
  24. "O": "k8s",
  25. "OU": "System"
  26. }
  27. ]
  28. }
  29. EOF
  30. #“O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
  31. #"CN": 字段 kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法
  32. #如果 hosts 字段不为空则需要指定授权使用该证书的 IP 或域名列表,由于该证书后续被 etcd 集群和 kubernetes master 集群使用,所以上面分别指定了 etcd 集群、kubernetes master 集群的主机 IPkubernetes 服务的服务 IP(一般是 kue-apiserver 指定的 service-cluster-ip-range 网段的第一个IP,如 10.254.0.1
  33. #对等证书 生成kubernetes的证书和私钥。使用CA认证中心的私钥和证书签名生成机构的证书和私钥。
  34. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer kubernetes-csr.json | cfssljson -bare kubernetes
  35. # 子节点客户端证书
  36. cat << EOF > kubernetes-proxy-csr.json
  37. {
  38. "CN": "kube-proxy",
  39. "hosts": [],
  40. "key": {
  41. "algo": "rsa",
  42. "size": 2048
  43. },
  44. "names": [
  45. {
  46. "C": "CN",
  47. "ST": "BeiJing",
  48. "L": "BeiJing",
  49. "O": "k8s",
  50. "OU": "System"
  51. }
  52. ]
  53. }
  54. EOF
  55. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-proxy-csr.json | cfssljson -bare proxy
  56. # master 主节点api服务管理客户端证书
  57. cat << EOF > kubernetes-apiserver-client-csr.json
  58. {
  59. "CN": "controllermanager",
  60. "hosts": [],
  61. "key": {
  62. "algo": "rsa",
  63. "size": 2048
  64. },
  65. "names": [
  66. {
  67. "C": "CN",
  68. "ST": "BeiJing",
  69. "L": "BeiJing",
  70. "O": "k8s",
  71. "OU": "System"
  72. }
  73. ]
  74. }
  75. EOF
  76. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-apiserver-client-csr.json | cfssljson -bare apiserver
  77. #生成如下文件
  78. kubernetes.csr kubernetes-key.pem kubernetes.pem
  79. #服务端证书 -profile=server
  80. cfssl print-defaults csr > server-csr.json
  81. "CN": "coreos1",
  82. "hosts": [
  83. "192.168.122.68",
  84. "ext.example.com",
  85. "coreos1.local",
  86. "coreos1"
  87. ],
  88. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
  89. #客户端证书 -profile=client 客户端证书可以忽略hosts,只设定CN通用名
  90. cfssl print-defaults csr > client-csr.json
  91. 修改
  92. "CN": "client",
  93. "hosts": [""],
  94. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client

验证证书

</>复制代码

  1. openssl x509 -in ca.pem -text -noout
  2. openssl x509 -in server.pem -text -noout
  3. openssl x509 -in client.pem -text -noout
  4. cfssl-certinfo -cert kubernetes.pem

导入证书到系统,更新系统证书库

</>复制代码

  1. update-ca-trust check #检查是否启用
  2. update-ca-trust enable #启用系统共享CA存储
  3. cp foo.crt /etc/pki/ca-trust/source/anchors/ #将证书复制到此目录 具有高优先级,不会被覆盖
  4. update-ca-trust extract #最后提取更新
  5. cat foo.crt > /etc/pki/tls/certs/ca-bundle.crt #老版本的处理方式

注意事项

设置所有私钥文件权限 chmod 600 *-key.pem

不要把你的ca-key.pem放入容器的Linux配置,建议将其存放在安全的地方。该密钥允许生成尽可能多的证书

使用通配符*地址生成的密钥和证书。将在任何机器上工作。它将简化证书例程,但会增加安全风险。

常用操作命令 配置 功能 功能1 功能2 调试 优化 常见问题 实际应用

</>复制代码

  1. cat << EOF > kubernetes-csr.json
  2. {
  3. "CN": "kubernetes",
  4. "hosts": [
  5. "127.0.0.1",
  6. "10.29.167.233",
  7. "169.169.0.1",
  8. "kubernetes",
  9. "kubernetes.default",
  10. "kubernetes.default.svc",
  11. "kubernetes.default.svc.cluster",
  12. "kubernetes.default.svc.cluster.local"
  13. ],
  14. "key": {
  15. "algo": "rsa",
  16. "size": 2048
  17. },
  18. "names": [
  19. {
  20. "C": "CN",
  21. "ST": "BeiJing",
  22. "L": "BeiJing",
  23. "O": "k8s",
  24. "OU": "System"
  25. }
  26. ]
  27. }
  28. EOF
  29. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer kubernetes-csr.json | cfssljson -bare kubernetes
  30. cat << EOF > kubernetes-client-csr.json
  31. {
  32. "CN": "controllermanager",
  33. "hosts": [],
  34. "key": {
  35. "algo": "rsa",
  36. "size": 2048
  37. },
  38. "names": [
  39. {
  40. "C": "CN",
  41. "ST": "BeiJing",
  42. "L": "BeiJing",
  43. "O": "k8s",
  44. "OU": "System"
  45. }
  46. ]
  47. }
  48. EOF
  49. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kubernetes-client-csr.json | cfssljson -bare apiserver
  50. cat << EOF > kube-proxy-csr.json
  51. {
  52. "CN": "kube-proxy",
  53. "hosts": [],
  54. "key": {
  55. "algo": "rsa",
  56. "size": 2048
  57. },
  58. "names": [
  59. {
  60. "C": "CN",
  61. "ST": "BeiJing",
  62. "L": "BeiJing",
  63. "O": "k8s",
  64. "OU": "System"
  65. }
  66. ]
  67. }
  68. EOF
  69. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kube-proxy-csr.json | cfssljson -bare proxy
  70. 证书转为浏览器可用的p12证书
  71. openssl pkcs12 -export -in apiserver.pem -out apiserver.p12 -inkey apiserver-key.pem

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/32806.html

相关文章

  • kubeadm部署k8s1.9高可用集群--2搭建etcd集群

    摘要:搭建集群前言安装的集群,默认是一个单机的容器化的,并且和通信没有经过加密和认证,这点是需要改造的。所以首先我们需要先部署一个三节点的集群,二进制部署,守护进程,并且需要生成证书。 搭建etcd集群 前言 kubeadm安装的集群,默认etcd是一个单机的容器化的etcd,并且k8s和etcd通信没有经过ssl加密和认证,这点是需要改造的。所以首先我们需要先部署一个三节点的etcd集群,...

    ZHAO_ 评论0 收藏0
  • kubeadm部署k8s1.9高可用集群--2搭建etcd集群

    摘要:搭建集群前言安装的集群,默认是一个单机的容器化的,并且和通信没有经过加密和认证,这点是需要改造的。所以首先我们需要先部署一个三节点的集群,二进制部署,守护进程,并且需要生成证书。 搭建etcd集群 前言 kubeadm安装的集群,默认etcd是一个单机的容器化的etcd,并且k8s和etcd通信没有经过ssl加密和认证,这点是需要改造的。所以首先我们需要先部署一个三节点的etcd集群,...

    scq000 评论0 收藏0
  • k8s 证书配置大全

    摘要:证书配置大全证书是网络通信的安全的要素,是现代网络通信的基本配置。包含一个命令行工具用于签名,验证并且捆绑证书的服务。 Kubernetes 证书配置大全 证书是网络通信的安全的要素,是现代网络通信的基本配置。各种远程调用的安全都离不开非对称加密提供的保障。 下载证书工具 cfssl 是 CloudFlare 开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具(cfssl,...

    lentrue 评论0 收藏0
  • 如何在Tomcat中做TLS客户端认证

    摘要:顺便一提,如果要使用客户端认证就必须使用服务端认证。修改,添加如下可以看到我们开启了客户端认证,也开启了服务端认证。所以如果要正确访问得像下面这样,指定证书,以及客户端自己签发的证书及测试我们现在用来访问看看。 常见的https网站做的是服务端认证(server authentication),浏览器通过证书判断你所访问的https://baidu.com是否真的是百度,而不是其他人伪...

    sugarmo 评论0 收藏0

发表评论

0条评论

沈俭

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<