使用vault搭建CA,即PKI
Vault是一个加密的键值存储,旨在解决当今组织面临的许多挑战,无论是小型创业公司还是企业,它们都面临一些基本问题,其中一个是“秘密蔓延”,其中意味着100个凭证只是漫游,由几十个不同的人生成。这是由于缺乏证书的集中化; 组织没有所有这些凭据来源的单一来源。
另一个这样的挑战是“有限可见性”; 组织不知道使用了哪些凭据?它应该被撤销吗?如果被撤销会破坏一些东西吗?您看,这些凭据的使用方式的可见性非常有限。
Hashicorp Vault是一个集中式键值存储,它使用策略和ACL提供对凭据的限制性访问。它还可以作为传递加密,这实质上意味着它不仅可以将数据存储在Vault中,而且可以将加密数据返回给用户,从而提供加密即服务(EaaS)模型。Vault的一些独特功能将其与市场上的任何其他工具区分开来,
- 使用秘密后端生成动态凭据。
- 对每个请求和响应进行身份验证和审核。
- 具有与之关联的租约的凭证。
但并非全部,Vault允许您管理整个公钥基础结构(PKI)以确保不同服务之间的安全通信。这允许公司使用简单的API调用轻松设置自己的证书颁发机构(CA),撤销或颁发新证书,从而摒弃不断生成自签名证书的痛苦过程。
在本指南中,我将简要介绍Vault如何工作,如何配置,以及最后如何使用它来创建自己的根CA,动态发布证书,从而利用Vault的auth方法。
本指南涵盖的内容:
- 安装和配置Vault
- 保险库初始化的工作原理
- 保险库如何保护自己
- 创建根CA.
- 创建中级CA.
- 向Web服务器颁发证书
正在下载Vault
Vault预编译的二进制文件可以从https://www.vaultproject.io/downloads.html下载.zip文件中的vault二进制文件是运行Vault所必需的。下载后,解压缩文件,
<span style="color:rgba(0, 0, 0, 0.84)">解压缩vault_0.10.4_linux_amd64.zip -d / etc / vault /</span>
将保险库添加到PATH中,
<span style="color:rgba(0, 0, 0, 0.84)">$ echo'export PATH = $ PATH:/ etc / vault /'>>〜/ .profile</span>
<span style="color:rgba(0, 0, 0, 0.84)">$。〜/ .profile文件</span>
验证安装,
<span style="color:rgba(0, 0, 0, 0.84)">金库-h</span>
Vault附带预先配置的开发模式,不需要任何进一步配置,并允许进行实验。在此模式下,Vault完全在内存中运行,并使用单个解封密钥启动未密封(稍后会更多)(建议不要在生产中运行dev模式,因为它非常不安全)。
为了充分利用Vault的功能,我将设置一个真正的Vault服务器,它需要一个与dev模式不同的配置文件。Vault接受HCL和JSON作为其配置,并且必须提供-config
标志。Vault接受各种参数,其中需要存储和侦听器。存储配置,其中Vault数据应被存储在存储后端,而后者则允许配置主机和端口,其中保管箱侦听API请求。您可以在Vault配置页面上浏览更多可选参数。
那么,让我们创建一个包含所需参数的配置文件,
<span style="color:rgba(0, 0, 0, 0.84)">后端“文件”{
path =“/ home / suf / secrets”
}</span>
<span style="color:rgba(0, 0, 0, 0.84)">监听器“tcp”{
address =“127.0.0.1:8200”
tls_disable = 1
}</span>
将以上内容保存在config.hcl
文件中,然后启动Vault服务器,
<span style="color:rgba(0, 0, 0, 0.84)">vault server -config config.hcl</span>
在服务器运行时,打开另一个终端,并初始化保管库以供使用:
<span style="color:rgba(0, 0, 0, 0.84)">export VAULT_ADDR ='http://127.0.0.1:8200'</span>
<span style="color:rgba(0, 0, 0, 0.84)">保险库运营商init</span>
一旦服务器初始化,您将在屏幕上看到一些有用的信息,包括Unseal Keys,Initial Root Token等,如下所示,
将此信息复制到一个单独的文件中,因为我们将尽快使用它。现在,让我们来谈谈为什么这些信息非常重要,以及为什么你的Vault存储如果丢失就变得无用。
让我给你一点背景知识。当您第一次运行Vault服务器时,它以“密封”状态启动,这实际上意味着即使Vault知道加密存储的位置以及如何访问它,它也不知道如何解密数据休息。
这是一种鸡和蛋的情况,问题是Vault应该如何访问自己的加密数据?必须有一个密钥才能解密保险库的整个存储空间。
那么Vault在哪里存储这个解密密钥?答案是,无处可去。实际上,vault使用Shamir的秘密共享算法,这是一种秘密共享的形式,其中实际的密钥被分成N个部分,T其中需要重新创建原始密钥。保管库中的这N个部分称为“Unseal Keys”,它们是在Vault服务器初始化时生成的。
那么,初始化Vault服务器时发生了什么?
当您首次使用vault operator init
命令初始化服务器时,Vault会生成一个主密钥,并立即将其拆分为5个关键部分,即“Unseal Key 1 ... 5”。该主密钥从未存储在任何地方,并且检索该密钥的唯一方法是让法定数量的密封密钥重新生成它,如下所示:
Vault使用Shamir Secret共享算法来创建主密钥
该主密钥用于解密基础加密密钥。
这是首次初始化Vault服务器时显示的实际消息,
Vault初始化为5个密钥共享,密钥阈值为3.请安全地分发上面打印的密钥份额。当Vault重新密封,重新启动或停止时,您必须提供至少3个这些密钥才能在开始处理请求之前启动它。
Vault不存储生成的主密钥。如果没有至少3个键来重建主密钥,Vault将永久密封!
如您所见,在我们可以访问Vault之前,需要3个Unseal密钥才能启动Vault。如果您在启封Vault之前尝试访问Vault,则会Vault is sealed
出现错误。让我们继续使用5个unseal键中的任意3个来开启金库,
<span style="color:rgba(0, 0, 0, 0.84)">保险库操作员开封5E + rusg + bMYNjLyI / QltN / WBB / uK8IhwjA9lKicLJPiP
保险库操作员开封06w4FpfzNbq4Vid060m4HRNZ4pW / 7ijLOuY4aXTRBdCv
保险柜操作员开封jP2ugbUMy1l2l + kNZQX8yfLtqGS25FVIRnRu4DD + z3PZ</span>
开封保险柜
成功启封后,使用之前保存的根令牌登录Vault。(您可以在此处了解有关Root Token的更多信息)
<span style="color:rgba(0, 0, 0, 0.84)">保险库登录</span>
您应该收到以下消息,
登录保险库
在继续之前,我们需要了解一些关于保险库后端的基础知识,因为这是我们将用于创建PKI的内容。
Vault后端
Vault具有后端概念,您可以将它们视为具有某些特定功能的插件。例如,在我们的配置文件中,我们使用了称为文件的存储后端。Vault还提供其他存储后端,例如; 内存,领事,mysql,postgresql等。
就像存储后端一样,Vault有“秘密后端”,负责管理机密。一些秘密后端只是像加密的键值存储一样,而其他秘密后端在查询时动态生成秘密。PKI就是这样一个后端,可以管理整个CA. 需要注意的是,与存储后端不同,存储后端只能有一个,可以创建多个PKI后端,并且可以使用路径将它们相互隔离。这在我们的情况下是必要的,因为我们将创建两个PKI后端,一个用于根CA,另一个用于中间CA.
我们现在有能力开始建立我们的信任链!
创建根CA.
在创建根CA之前,我们需要启用PKI后端,并将其挂载到路径,
<span style="color:rgba(0, 0, 0, 0.84)">保险库密码启用-path = rootca_store -description =“根CA的PKI后端”-max-lease-ttl = 87600h pki</span>
<span style="color:rgba(0, 0, 0, 0.84)"><strong><em>成功!在以下位置启用了pki secrets引擎:rootca_store /</em></strong></span>
通过列出所有秘密引擎验证,
<span style="color:rgba(0, 0, 0, 0.84)">保险库秘密清单</span>
-path
rootca_store
在这种情况下,选项在新路径上挂载PKI秘密后端。保险库中的每个秘密引擎都定义了自己的路径和属性。对于用户,秘密引擎的行为类似于虚拟文件系统,支持读取,写入和删除等操作,具体取决于使用角色分配给它们的权限。
现在让我们创建我们的CA证书和密钥。
/pki/root/generate/:type
端点用于生成根CA. :type
在此端点中指定要创建的根的类型。它可以是exported
,在这种情况下,根私钥将在响应中返回; 或者internal
,私钥不会被退回,以后无法检索。
<span style="color:rgba(0, 0, 0, 0.84)">保险库写rootca_store / root / generate / internal \
common_name =“suf.com”\
ttl = 87600h \
key_bits = 4096</span>
要了解我使用的其他选项,请查看Vault的PKI文档。
验证是否已生成证书:
<span style="color:rgba(0, 0, 0, 0.84)">curl -s <a data-cke-saved-href="http://127.0.0.1:8200/v1/rootca_store/ca/pem" href="http://127.0.0.1:8200/v1/rootca_store/ca/pem" class="markup--anchor markup--pre-anchor">http://127.0.0.1:8200/v1/rootca_store/ca/pem</a></span>
大!您刚刚创建了一个根CA.
可是等等!我们还没有配置证书撤销,即CRL或OSCP。必须使用config/urls
端点配置。
让我们继续并配置CRL然后:
<span style="color:rgba(0, 0, 0, 0.84)">保险库写rootca_store / config / urls issuing_certificates =“ <a data-cke-saved-href="http://127.0.0.1:8200/v1/rootca_store/ca" href="http://127.0.0.1:8200/v1/rootca_store/ca" class="markup--anchor markup--pre-anchor">http://127.0.0.1:8200/v1/rootca_store/ca</a> ”\
crl_distribution_points =“ <a data-cke-saved-href="http://127.0.0.1:8200/v1/rootca_store/crl" href="http://127.0.0.1:8200/v1/rootca_store/crl" class="markup--anchor markup--pre-anchor">http://127.0.0.1:8200/v1/rootca_store/crl</a> ”</span>
注意我还配置了issuing_certificates
url,它指定了Issuing Certificate字段的值。二者issuing_certificates
并crl_distribution_points
可以是一个数组或逗号分隔的字符串列表。
创建中间CA.
必须遵循以下步骤才能生成中间CA:
- 将PKI挂载到新路径
- 生成中间证书签名请求(CSR)
- 使用根CA签署中间CSR并生成证书
- 将Root签名证书导入中间CA.
- 验证签名是否成功
- 配置证书吊销
让我们开始吧!
- 将PKI挂载到新路径
<span style="color:rgba(0, 0, 0, 0.84)">保险库密码启用-path = interca -description =“中间CA的PKI后端”\
-max-lease-ttl = 87600h pki
<strong><em>成功!启用pki秘密引擎:interca /</em></strong></span>
- 生成中间CSR
生成证书签名请求,并将其保存到文件中,我们将其命名为signing_request.csr,
<span style="color:rgba(0, 0, 0, 0.84)">vault写interca / intermediate / generate / internal ttl = 26280h key_bits = 4096 | grep -zo - “ - * BEGIN。* END。* - * $”> signing_request.csr</span>
我们需要从中间机构获取该签名请求,并使用之前生成的根CA对其进行签名。
- 使用根CA签署中间CSR并生成证书
<span style="color:rgba(0, 0, 0, 0.84)">保险库写rootca_store / root / sign-intermediate \
csr =@signing_request.csr \
ttl = 8760h \ format = pem_bundle</span>
将certificate和issuing_ca保存在一个文件中,假设是mycertreq.crt,
<span style="color:rgba(0, 0, 0, 0.84)">----- BEGIN CERTIFICATE -----
MIIFhzCCA2 + gAwIBAgIUH83a + PyxwgzsZERZHzRR1kwwSc4wDQYJKoZIhvcNAQEL
BQAwEjEQMA4GA1UEAxMHc3VmLmNvbTAeFw0xODA4MDUwMjEyMTJaFw0xOTA4MDUw
MjEyNDJaMAAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDNgvwCJIY /
+ DxWl34sFz7QaI17ckBcAqv0dQbjH1yFXQ7H9Rt / jx1sUIZ8ErAJZzbSOUCPZWQ8
sMtnvhshptPIlqg7JmCcz6kWQaY1cO9qGaVlFUJunfIbY0l8EJX6LSjN82OskyXk
1PLWWTYS32GqJqCTYXe4ZhUJ3TYSkrJKd8MBGu4IPVaZOxlbsR63S + Gv9e + oIWiS
Y5 / Vh07BihHHUJrWjov0ab4e4uhFduQrMsbr8k4q83XeNII4Uq1MzQvf3EK3l6fc
JqQ86NEqi36DBUgIJLb / SmyCoYBY37EQgsmEcOiaDJiaoOT / tfO6IYnhB9B9zEQU
8lOnFD8ULlGdfu / YaxRixKKIYFTzeAU / 4YDGRxO5drYIK0uCqC83aZYFZnX9U4cN
5 / sxGTIq / 5ZkQA11bYCGnFr5OzraRA7kkOxIYOWDuW / cxEhm2O5pRRoZY2Dzi55U
4Y9JS0 /的Rq + TXveHCLm6gtYsKK8g1dGiMGiiFnOZn6XhAh5TFLTEjFdbi8a5jBzG +
QDI / APWA + 3wHgPhTw2i5ynVOOkq0 /氪+ 425wd4WAwycKb3m8xPtrZCzO3U4xysHe
W + fV7a363 + 0aT4ftyRUEZache6Xd7 / YTZxoVbr6 / AZ + AC + sbU8QeN4S6n7LaUTmB
8DkruOhWu0B + CI4PfevWScwSk4XGu0IKvwIDAQABo4HmMIHjMA4GA1UdDwEB / WQE
AwIBBjAPBgNVHRMBAf8EBTADAQH / MB0GA1UdDgQWBBRCLHE6vM3saxmePN8Uc4uu
SdcwRTAfBgNVHSMEGDAWgBQIviOHuu6uxaPbmCpy1riVAmnOkDBEBggrBgEFBQcB
AQQ4MDYwNAYIKwYBBQUHMAKGKGh0dHA6Ly8xMjcuMC4wLjE6ODIwMC92MS9yb290
Y2Ffc3RvcmUvY2EwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovLzEyNy4wLjAuMTo4
MjAwL3YxL3Jvb3RjYV9zdG9yZS9jcmwwDQYJKoZIhvcNAQELBQADggIBAFxSk + ZD
09mEtlOR75t5ZOuwsNXnlPAhAiSSioqDtIXYR3 / 8QhE8PDyiP3ZM6LaCp24QSh8B
MlPPQ4DkVul1ofAGDU7vfk5tCaj8AAPPFp8Dikffw5HFuhDeEa4EYqRWr1uhz +牛
6V177k27FKrL4dAvOu7Hi0cTXC3vahTF25tV8v3GHz1XGlalCUL9IVa7L22a0evN
Cfx9ewRz7fAwEN1mygwC + SBfY / 0TlrTb8tlPuMaTZAafS8x4mJuvO9a41sK2i / 1K
mn0N8n5sGjh9JJBMEJ4b9jDfwJLB7a91Hv4kGMO7 / qyEwl4rQJdMWrBVYkrncSXu
LW1LMeCfzZRecMHZMdwuWwdQzBrIXky96vu1T5iiaBUJPBTcC7aHSfwn0gGQyYaI
kc3Us5RgToZES + SksrcUWBhHVsndme4CGHXiiKHox / HKZE3ctcc + AJq ++ kUwMb0P
XP / WyVINjLTjX80YL5Qjf4ROqcCOzQmnF2Yqx + 9ujTEEkJ9 / ZK56bIUWtq2aVLtz
EKDaBNYD8ss9fizqDWtGKFscObdu7xuNj8VViAqerDhgx / YqOykE8OWhRgxQpNSl
qroZr4Vi2cBPFIB4FdjA6rmFKNE5EEsdF / 6df9Lt6 + bGhmR9ZlxEmbWMHO + XeFfB
4olsunIOoaF0qAV + BtnzvK4CJVrLo3y7kqE8
----- END CERTIFICATE- ----
-----开始证书-----
MIIFKTCCAxGgAwIBAgIUdRRhQEOr37CPPjR9PKMMRzZOcLcwDQYJKoZIhvcNAQEL
BQAwEjEQMA4GA1UEAxMHc3VmLmNvbTAeFw0xODA4MDUwMDQ2MThaFw0yODA4MDIw
MDQ2NDdaMBIxEDAOBgNVBAMTB3N1Zi5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQDeqKJ256dW9USAzsKWRxfoLk3oM0 / JBosAD4Ab4bt40MiRCSav
i5rqBA0JIDC85N1dQBA73iU0a43D0hGWXY3B9IdzlHR3mPLTBtEtp / bL6Yn6D1dj
cbBSMNjfbyjOCa942IQP4CrDyXkC8XnjRkDmrNLxVXSDOAHnbAePHZaF9U2TMZ3w
olOwkffxFQ / KxEqluVXSKTipZM1FNMN4tjYigoDHHutc2MCP9h9yG8G / PdAKMh +一个
quRECkYPbhKJkRaPYeuEec2yc + RWNRE0irfadnRVhjcCDp / TEHDrZlVbgLHjF5g3
gI421qtAHOtPIdDIqFaODJ1rIWHGrVIH9ohEp00T7FTHgqpssuAvIeBcdAfpbcIs
r3VTDOKD / 3V9fwzkjLfEqnV / kxyHumDCSD5pAqyVn0nGgPv8a4ayOkh8RUvq9igY
rzkJWck4WXfalTOnDV8BTX7H8GLvZ7CnzPp + jR9miNMhSeq4WCMMIkaGX / yV2U1Q
GMV / UuP5dLHB / PeksAyJGDGjMqTLKlaHe2aRvEjlqvTWpoTglwOYTSC / BmRZbDAX
WKtvjmVVXedOiLQ37q + AGklpJa6GlcGBeqViQKFnEHuUr3aiT26YGGgPGwE4 / LXQ
HWUonCkrsWAkKdjErxMLs4KxQXSPRJDo17b / Hs3ybtrY8Z9Ddt3Gng + aEQIDAQAB
o3cwdTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH / BAUwAwEB / zAdBgNVHQ4EFgQU
CL4jh7rursWj25gqcta4lQJpzpAwHwYDVR0jBBgwFoAUCL4jh7rursWj25gqcta4
lQJpzpAwEgYDVR0RBAswCYIHc3VmLmNvbTANBgkqhkiG9w0BAQsFAAOCAgEA1YpO
nToJOgNt2UYNRL / p9rxPO7a3eWnqYnH065kt + ygAJUaagVULUWOMGjkO4lAhFbMg
TKn1kzoLWvYAqv5urK8YmIx3G9EitLdX2D7pUU4XvNI0aJwrbVR4fa1zMaFedQJ7
r7ml8gpddArYRbpH3I4PexiYLBUxi2e2sBxpCgBdRI4YQ38jF8W6nso5x + 1YLLax
GRj6 / NykYYG6ON6t65TMLOQnBqEAEkWxbczmq2LMd8D7ufYBMJg1hChM8KpcD6Sq
5uoD5PaGkeYsdX6Gdd8RtWVDG0bi5hUqvCkxpvXakbOmo4DMc + WW / mc0LL5mlecd
9HX1cs9ZBjJEQ5ADul6GGOpeqxsWdE543OnNsy6HjnXYJhHPbu342c + jlXccCpnA
KfmpZdFU58KYzaHAKudV9PWlyloUk0X3gIqSqHX7bX7 / 8E3MtTivJKxl9zIaI / YP
EgYHLwZQ10ODi2tlSs1zJ6KYYFyrtVSqdysnTAg2WtH3uFtWOf181VMs3BpgdyUk
6EPbdyluZ27nzA2 / OFVECAUwfjVPIx98Y6g1CYa3cTjOMJcmoiNDL6ciptfDDsVt
iePV5Ybos0fUD7 / IyUHGSNnvyXDiCrFfTCFdveqiU6vkKj6oPQI2WPIKrZPsymnC
DbUog0VYDpC / M10Dix9s51lfdKyvar7uDuJ6ONw =
----- END CERTIFICATE -----</span>
- 将Root签名证书导入中间CA.
现在我们有了一个Root CA签名证书,我们需要将它导入我们的中级CA后端。
<span style="color:rgba(0, 0, 0, 0.84)">vault写interca / intermediate / set-signed \
certificate = <a data-cke-saved-href="http://twitter.com/mycertreq" href="http://twitter.com/mycertreq" class="markup--anchor markup--pre-anchor">@mycertreq</a> .crt</span>
<span style="color:rgba(0, 0, 0, 0.84)"><strong><em>成功!写入的数据:interca / intermediate / set-signed</em></strong></span>
- 验证签名是否成功
<span style="color:rgba(0, 0, 0, 0.84)">curl -s <a data-cke-saved-href="http://127.0.0.1:8200/v1/interca/ca/pem" href="http://127.0.0.1:8200/v1/interca/ca/pem" class="markup--anchor markup--pre-anchor">http://127.0.0.1:8200/v1/interca/ca/pem</a> | openssl x509 -text</span>
- 配置证书吊销
我们需要做的最后一件事就是设置CA和CRL的URL,就像我们对根CA一样。
<span style="color:rgba(0, 0, 0, 0.84)">vault写interca / config / urls issuing_certificates =“ <a data-cke-saved-href="http://127.0.0.1:8200/v1/interca/ca" href="http://127.0.0.1:8200/v1/interca/ca" class="markup--anchor markup--pre-anchor">http://127.0.0.1:8200/v1/interca/ca</a> ”\ crl_distribution_points =“ <a data-cke-saved-href="http://127.0.0.1:8200/v1/interca/crl" href="http://127.0.0.1:8200/v1/interca/crl" class="markup--anchor markup--pre-anchor">http://127.0.0.1:8200/v1/interca/crl</a> ”</span>
我们的中间CA现已配置并准备颁发证书。
- 请求Web服务器的证书
现在我们已经配置了CA,我们想要颁发证书。这样做需要两个步骤:
- 我们需要配置一个角色。一个角色是映射到一个逻辑名称策略用来产生这些凭据。我们的角色将定义我们生成的证书的约束,例如:密钥类型,强度,允许的证书类型等。
- 我们需要使用我们创建的角色申请证书。
roles/:name
endpoint允许我们创建或更新角色定义。我们用它来创建角色名称test_server
。
<span style="color:rgba(0, 0, 0, 0.84)">保险库写入interca / roles / test_server \
key_bits = 2048 \
max_ttl = 4380h \
allow_any_name = true</span>
前往Vault的角色文档,了解其他可用选项。
现在,我们可以使用此角色颁发证书,
<span style="color:rgba(0, 0, 0, 0.84)">保险库写入interca / issue / test_server \
common_name =“your_server_hostname”\
ttl = 720h \
format = pem</span>
它将生成一个新证书,并输出issuing_ca和一个需要由依赖方(我们的test_server)使用的私钥。
恭喜,您刚刚发出了第一份证书!
下一步是什么?
我们需要在Web服务器上部署此证书,并使用本地浏览器对其进行测试。
我将在我为本指南创建的nginx服务器上部署它。
以下是我们要做的事情:
- 在单个文件中保存
certificate
并issuing_ca
生成证书。 - 保存
private_key
在单独的文件中 - 将证书和private_key移动到nginx服务器中
/etc/nginx/cert/
- 配置nginx以使用此证书。
保存的证书生成的私钥/etc/nginx/cert/key
:
<span style="color:rgba(0, 0, 0, 0.84)">----- BEGIN RSA私钥-----
MIIEpAIBAAKCAQEAxOQ + LLtHQI3 / 8FJDQOjb1K5fEFER8rJjBEGgFeHYYrXN9kKh
ZfiRVybYgLUXqedn3NJkTANiwlyrRIjW5Dk1qwgA34SlXXEpRubk86Dxpj1s5Mv5
qUA9G1P2PgvBmP02 / pBX1blfSLCwUaqx9HHhvimDiNVWWImN5Z7PWNqvqy5ojNmG
akLjTCAVqenpLEWOd7KdCY5u127i6ehMsazzjiYH1YYV0gnlP555Ay / iWXF7nJXJ
If42oO8z0olum2nj + YXE604HDr43sKVyhB1r27fqMvD5GiMHt3RZIWmmstwaOO /米
8aZk2E / LX69x27SE21Szkh6JbYHgbId48LvlOQIDAQABAoIBAQCvvpOI1fm5s4Za
evMxAykF5EdShyqgGX6sk + 9S2O6O3XzkbYEnRgJlanUiHYLr03Qv9VQ1TWhf2Nu /
Ju25dR9kdJZi7UG18IZJlVuT43sPShDjAPbujjp9JCrOIyxBZPQrsafVS8uzVJNt
shF6AhTf6qpP / y09hjq0VVb7FuhqwERSyUaKJGLxeKbsQEUnBt8I4ZvGeVXZkgFn
SHZ + F8LVQ7LSwRUdr + jMYSOGni3rhx2YWqGFBqcAlG3mx232BlOWwRXSAb6YzYS3
JlhLjkXxxeBIjFlBtYDbkmp + o3kajEmR41CZwY1uBxyGzca204yyj3L + JHgJlNfv
GCTwrB8hAoGBAMdzS2DIMI / EL / GLQtCJ5PnLvzZeyMFFUsnd7NRRR7YeRCyx / jYO
Q16lav3g583WRgWUTNgoBjAgjAN41adgWMlUI1uHj4kWh / Z6ZPOvou37DpddwHAp
PPRXBvHOsHlnKz7OsL6nhKp5pUJDIor3cIbpaHdqmePgJ3R2WRkbvdy1AoGBAPy3
OTCnq0mxouzli + 5oJ + 0Lzf2Blky2Wq6nTbmNsmx1mqDYeGQ / O50fAIiR6VLrJOjJ
sf0VIrp480ut0OutoouFfxCMMOa5n20Vv98 / TKqIRXd + r75iFPgAyuxP0VN3Bt3k
JZJmQK4ggQU2cpFlLdd1xxC6AFOaVoUvumMMoHz1AoGACMuSxV / OlGhoXNRxS9To
3gMYGYOwgqVV80TwDqTO7r8C7p2iwit62Q + eWjeywSbzy4cwpE + PhkvJINYRReI /
yBEHxh + COt9de4cGMKDMJIZvrEkcFVYcNAIqcjtVGOVtyMVAkge9F + 9pVDS1rz8e
HTTpwGpZAu19j + swHqVUiAkCgYBSeEyOhzkLrI + ZtXNL0uusnNyVLRPqZtwDARAJ
TKd8Y4iZkur + 8 ++ 1X6eh6dP1vkzmNuQBzkLuDYiAGvIB50ETPPZxZP6UXOEdDSr3
ZMXVJPFehJY / J + x93mxaX9XU4hP4l3p3Yy0aZfsUw2bx8c3a8VGMMNbocYZoomG1
7yn0fQKBgQC9BFfo0UdODFyRjALG0OlSThikXAGtXPxfBXI20wZRcOTouXwRy2sm
M4HZVmoIkeuLKewXgbO5MFR5jhlVCz2CZAcY1tPMyjHi0jWnPW / 8IVTQfifp7n / s的
bsH08 + Nh4zmp4VsdXyuyB8Col / FkFc2B5fNRkSP9mExEvaoibOx7ig ==
----- END RSA私钥-----</span>
certificate
其次是issuing_ca
证书保存在/etc/nginx/cert/ssl_cert
:
<span style="color:rgba(0, 0, 0, 0.84)">----- BEGIN CERTIFICATE -----
MIIEbDCCAlSgAwIBAgIUZdZvZtcKcIBMaESNdZnBbDLFA3AwDQYJKoZIhvcNAQEL
BQAwADAeFw0xODA4MDUwMzMyNTBaFw0xODA5MDQwMzMzMjBaMBExDzANBgNVBAMT
BnVidW50dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMTkPiy7R0CN
// BSQ0Do29SuXxBREfKyYwRBoBXh2GK1zfZCoWX4kVcm2IC1F6nnZ9zSZEwDYsJc
q0SI1uQ5NasIAN + EpV1xKUbm5POg8aY9bOTL + alAPRtT9j4LwZj9Nv6QV9W5X0iw
sFGqsfRx4b4pg4jVVliJjeWez1jar6suaIzZhmpC40wgFanp6SxFjneynQmObtdu
4unoTLGs844mB9WGFdIJ5T + eeQMv4llxe5yVySH + NqDvM9KJbptp4 / mFxOtOBw6 +
N7ClcoQda9u36jLw + RojB7d0WSFpprLcGjjv5vGmZNhPy1 + vcdu0hNtUs5IeiW2B
4GyHePC75TkCAwEAAaOBzDCByTAOBgNVHQ8BAf8EBAMCA6gwHQYDVR0lBBYwFAYI
KwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBQiuugAzw + S17dbCofdj3WVcZvC
PzAfBgNVHSMEGDAWgBQ2t80LsdTqSoYnYlrRBqk8B0cfEDA / BggrBgEFBQcBAQQz
MDEwLwYIKwYBBQUHMAKGI2h0dHA6Ly8xMjcuMC4wLjE6ODIwMC92MS9pbnRlcmNh
L2NhMBcGA1UdEQQQMA6CBnVidW50dYcEwKgvhTANBgkqhkiG9w0BAQsFAAOCAgEA
xmI2xYGuOpe + YKR / rKGDvIGURDUGAY0kvxLleE4arSKPOWG11jFlv7 + MLl1c14 + T
R7CV3 + NFsScJoZf6nppecz6O + VSRzbsGqHY2b4LlMmGFrLQJO + VhpqAgG0DGIE60
BLKL左张力传感器+ IhMOpZLoO9ATjvAMYCKm2rXMgrPHO0PCZwSys9Cti / r0xR7l2fPVYRCcyrp
eHG0UjncbEmZ9ymzz6mi9sC1ICCcgra + UsV9K9ez3C / MKmQN2UkwZd814zS9Gi0Q
JrlxPN + QO1NdToowyT7JpEod615OkaRv8p5LnGsvdNghnmnCpmI3qh0XvexT + YUX
LkHBXX9jWvNL528VXgL59en9EN4lE82 / TkwfdTvMEb2YmqqsmklrRTNlJM1UJLYX
一个+ oO6FoUDGDo3bl7YNh7r0W5huXeHurmP4ZSsn8H2LSYCiVglyUgUjyv8GYPJDLR
b5CiN8LCMJJH7TZ2frX7SKAr / TsqIEK5eFqYG / 0rwjihWcBYckvW0ectINeLZC8z
SeDGFG7CeB5LLeLY6V9cPycgMq0uwOANsitCZCEDc3LM9lWg8I73PFvwTxuET + F /
Q1wrGSyAZ6ly8oB8e8pMlxoyjVU7DGU + jiM4xkD2ane5laRKbOtHmlF9rxqUD1lw
wmUdBMdXOMVvd + kNMlv6qv9MH / yHN7RRgjtFQ71Meis =
----- END CERTIFICATE -----
----- BEGIN CERTIFICATE -----
MIIFhzCCA2 + gAwIBAgIUTC8C3fVWCveITXkHOQS + mUcjlcEwDQYJKoZIhvcNAQEL
BQAwEjEQMA4GA1UEAxMHc3VmLmNvbTAeFw0xODA4MDUwMjI3MjdaFw0xOTA4MDUw
MjI3NTdaMAAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDtDiRPdl4T
BFTrK0OS6C4wbr / zMhcPwg1XZEwr57GvaAeDxNK2EB2lgX41d6J + xbdBT / R + Yjg9
FzQX5R97l3Or2J7oV4j6zSYF87hs4gs7aWXkNur9qMuYWU6GEQEOTwv1aF4Uc5NW
wK1W6NbElcFGujRZ0Fv3JnV6G + F / SONE8s8y1jJZCHnsoaQKHHq8xcFnwLOnUVvS
FbHwZoQYdYZHqg4jqovc / Z9sa + lVvLzwpsTDuYe1FBcF9ZLPrTP6QtLwr / 9HseF /
kgnqViXGIpRf78tda + F8HGuMGh0I37Z7CU66JX8s3 / OcfmUUX6DqHb3oXaLpdPJO
EOhmcds2fhg / Bjhinj0K6f4uomihkfRr1DdOzc8xZ0EEfyuJ66KXZi4XyYvwU1Gm
oua8HTV7fL64zBTawaqEWbqBNPSRiPpJsciSkN8YfVhrYb6LIhWpDmXlW9iD8uyf
wDDMmqUwzQKyHUjsRsSfLfbHWcgKTia / umea9YyJw0IBk8cIL6 / QS + FWer5i3689
FJNn9Nw / OeRPxf5gz0eVRRY + URAbPQexgcjvVryHvzpZZGKJbrTGeqdtpel64tZu
aEj6gBorAJ6ooeiHZqgwQ1nXhlcVQv827lUYiY7zUXNq + DB812VtzHlytpo + sIez
+ 93oPCJmZaG8S3kn02a0dGE8TO8l2Ll0GQIDAQABo4HmMIHjMA4GA1UdDwEB / WQE
AwIBBjAPBgNVHRMBAf8EBTADAQH / MB0GA1UdDgQWBBQ2t80LsdTqSoYnYlrRBqk8
B0cfEDAfBgNVHSMEGDAWgBQIviOHuu6uxaPbmCpy1riVAmnOkDBEBggrBgEFBQcB
AQQ4MDYwNAYIKwYBBQUHMAKGKGh0dHA6Ly8xMjcuMC4wLjE6ODIwMC92MS9yb290
Y2Ffc3RvcmUvY2EwOgYDVR0fBDMwMTAvoC2gK4YpaHR0cDovLzEyNy4wLjAuMTo4
MjAwL3YxL3Jvb3RjYV9zdG9yZS9jcmwwDQYJKoZIhvcNAQELBQADggIBAFnUFAi6
lqkJHPJWXof259nZ / unXjqB39ZApEZY6uy7lrhIo3M / HbWAygZjElNAdk +乌拉/ 79
rWTRSoQu2yl91KnQmIB6ZuaPtgAMpMbm3acAtmrnD7ibZKxSSA3WXb1cQi0b9eFf
wR6uUfZuB7cGgtvT + 9p44LpxLHHHzYy1c2AMifArJtR0HmhUZbZy30uHf + kxcSsk
NFsVp3xJLjtL6giZv5hv5TubGo + i4BYFoQ / fOLmI2zo4dFJwHtSRwyxomYl92egH
ZgmRyKjtqNqlmbFfSl3K ++ M3oAmbTIys9Rel1sSqStUPxmlY0xJi02iN / ClyIdSa
B + Q3ccBQrE9COAhEeV + zgUq4okvE7AOkP8SsJ9a3VhLijjNeb / Migm6Z + Wl6pPbP
uYPOMLfTOTo9NBdFTT9yR9HRSHwdtWhpEX0kuZ5B4eDk586WXkIZWzEw1cEeRAzb
kM9lSuHKo016bwRUNGlVFlDTi + zGUbxfIKD9 / tqI8Vw5OkUQI8FTXqLbe5C4XMT3
JTSo3XKneXxuF6fpXe + eUTkU02hwhIJOM1w33riZmf5QoCwTcttDaY3W / 5aN8pIs
+ r5lPwtKjz5mQWVJT4xDuRs5bfUNjRq + MREVUdORwdtRfEUfb8uMIEuMRX8Wr2kB
Xn8kPbKGYxJhp2A5WVy5 / E6DW5DFG6by6syT
----- END CERTIFICATE -----</span>
这就是我的nginx.conf
样子,
<span style="color:rgba(0, 0, 0, 0.84)">http {
include /etc/nginx/mime.types;
default_type application / octet-stream;
server {
listen 443 ssl default_server;
server_name test_server;
ssl on;
ssl_session_timeout 5m;
ssl_certificate / etc / nginx / cert / ssl_cert;
ssl_certificate_key / etc / nginx / cert / key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;</span>
<span style="color:rgba(0, 0, 0, 0.84)">location / {
root / usr / share / nginx / html;
index index.html index.htm;
}
}
的access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;</span>
<span style="color:rgba(0, 0, 0, 0.84)">include /etc/nginx/conf.d/*.conf;
包括/ etc / nginx / sites-enabled / *;
}</span>
Web服务器现在使用我们自己的根CA颁发的证书!
测试
您的根CA证书必须在本地浏览器中可用,才能执行身份验证。
从Vault服务器,访问并保存文件中的Root证书,比方说root.crt
,
<span style="color:rgba(0, 0, 0, 0.84)">curl -s <a data-cke-saved-href="http://127.0.0.1:8200/v1/rootca_store/ca/pem" href="http://127.0.0.1:8200/v1/rootca_store/ca/pem" class="markup--anchor markup--pre-anchor">http://127.0.0.1:8200/v1/rootca_store/ca/pem</a></span>
然后在您的本地浏览器中(我使用的是谷歌浏览器),转到Settings
- >点击Advanced
页面底部的,然后选择Manage certificates
,
接下来,单击Import
并选择之前保存的根证书文件,单击Next
和Finish
。您应该收到以下消息:
现在访问您的Web服务器,您应该看到您的连接是安全的。
您的服务器正在使用您自己的根CA颁发的证书。