ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Istio 安全测试证书生成指南:使用 generate_cert 工具签发 ECC 根证书与工作负载证书

Istio 安全测试证书生成指南:使用 generate_cert 工具签发 ECC 根证书与工作负载证书 Istio 安全测试证书生成指南使用 generate_cert 工具签发 ECC 根证书与工作负载证书【免费下载链接】istioConnect, secure, control, and observe services.项目地址: https://gitcode.com/GitHub_Trending/is/istioIstio 的证书与 mTLS 相关单元测试需要大量固定的 X.509 测试夹具而手工拼装 PEM 既不准确也无法复现。security/pkg/pki/testdata/README.md给出了生成 ECC椭圆曲线测试证书的官方推荐流程统一使用security/tools/generate_cert/main.go这个命令行工具完成根证书签发与子证书签发的全部工作。读完本文你将掌握该工具的完整参数、三种运行模式以及如何为单元测试一键生成 ECDSA 根证书和由其签名的 ECC 客户端证书。文档与工具定位security/pkg/pki/testdata/是 Istio 安全PKI模块的测试数据目录其中存放了 CA 根证书、工作负载证书、证书链以及大量用于负面用例解析失败、验证失败、过期等的 PEM 文件被 pki/util 下的单元测试大量引用。该目录中的 README.md 虽然篇幅简短却明确了一条重要工程约定一般情况下团队倾向于通过运行security/tools/generate_cert/main.go来生成证书而不是手写 PEM。也就是说security/tools/generate_cert/main.go约 170 行是这批测试证书的官方生成器。它以 Go 标准库crypto/x509与仓库内部security/pkg/pki/util包为基础封装了一个可复用的证书签发命令行程序。工具能力全景三种模式与完整参数从 main.go 的源码可以看到工具支持三种运行模式模式常量命令行取值含义selfSignedModeself-signed默认生成自签名证书可配合-ca生成自签名根证书signerModesigner使用指定的签发者证书与私钥签发新的子证书citadelModecitadel从 Kubernetes Secretistio-ca-secret拉取 CA 材料作为签发者借助 kubectlcheckCmdLine 会对三种模式做参数合法性校验self-signed/citadel模式下-signer-cert与-signer-priv必须为空signer模式下-signer-cert与-signer-priv二者必须同时给出其余字符串一律报Unsupported mode。完整命令行参数清单如下均为源码中 flag 的真实定义与默认值Flag默认值说明-host逗号分隔的主机名/IP也可填入 workload 身份如 K8s ServiceAccount-start-date证书生效时间格式Jan 2 15:04:05 2006为空则取当前时间-duration10*365*24h10 年证书有效期 TTL-cafalse是否生成 CA 证书-signer-cert签发者证书文件PEM供signer模式使用-signer-priv签发者私钥文件PEM供signer模式使用-clientfalse是否为客户端证书追加clientAuthEKU-serverfalse是否为服务端证书追加serverAuthEKU-organizationJuju org证书 Subject 的 Organization 字段-out-certcert.pem输出证书文件名-out-privpriv.pem输出私钥文件名-key-size2048RSA 私钥位数仅当使用 RSA 时生效-modeself-signed运行模式见上表-ec-sig-alg生成椭圆曲线私钥的签名算法目前仅支持ECDSA为空则回退到 RSA-curveP256椭圆曲线源码层面支持P256与P384-sanSubject Alternative NamesSAN取值写入 DNS SAN值得注意-ec-sig-alg一旦非空就启用 ECC 分支-curve传入P384时使用elliptic.P384()其余情况含默认值P256走elliptic.P256()可见 generate_cert.go。若-ec-sig-alg留空则生成 RSA 私钥且-key-size不得低于仓库规定的最小 RSA 位宽。实操一生成 ECC 根证书CAREADME 给出的第一个命令用于生成 ECC 根证书go run main.go -ec-sig-alg ECDSA -ca true在security/tools/generate_cert/目录内执行即可。该命令的语义是-ec-sig-alg ECDSA采用 ECDSA 生成 P-256 椭圆曲线私钥-curve默认P256-ca true使证书带IsCA约束并只授予KeyUsageCertSign用途见 genCertTemplateFromOptions即只允许用它来签发其他证书-mode缺省为self-signed即自签名 CA。生成的证书默认写到当前目录cert.pem私钥写到priv.pem。仓库中实际已经提交了这样一批产物security/pkg/pki/testdata/ec-root-cert.pem根证书security/pkg/pki/testdata/ec-root-key.pem根私钥用openssl x509 -in .../ec-root-cert.pem -noout -text可以验证其内容特征与上述参数完全吻合签名算法为ecdsa-with-SHA256Subject/Issuer 为默认的O Juju org公钥为 256 位P-256EC 公钥有效期约 10 年2021-04-25 至 2031-04-23。这说明仓库中现有 ECC 夹具正是由该工具以默认参数生成的。实操二用根证书签发 ECC 工作负载客户端证书README 给出的第二个命令演示了如何用上一步的根证书作为签发者签发一张带 SAN 的 ECC 客户端证书go run main.go -ec-sig-alg ECDSA -san watt \ -signer-cert ../../pkg/pki/testdata/ec-root-cert.pem \ -signer-priv ../../pkg/pki/testdata/ec-root-key.pem \ -mode signer这里需要澄清路径语义README 中../../pkg/pki/testdata/...是相对security/tools/generate_cert/目录的局部相对路径向上两级恰好落在security/pkg/pki/testdata/。若在仓库其他位置执行请改用仓库根相对路径go run security/tools/generate_cert/main.go -ec-sig-alg ECDSA -san watt \ -signer-cert security/pkg/pki/testdata/ec-root-cert.pem \ -signer-priv security/pkg/pki/testdata/ec-root-key.pem \ -mode signer该命令的关键点-mode signer触发 LoadSignerCredsFromFiles从文件读取签发者证书与私钥并解析为x509.Certificate与crypto.PrivateKey-san watt为证书添加一条 DNS 类型的 Subject Alternative Name值为wattwatt是 Istio 集成测试里常用的示例工作负载名之一签发出的私钥同样是 ECDSA P-256-ec-sig-alg ECDSA产物对应仓库中的security/pkg/pki/testdata/ec-workload-cert.pem与ec-workload-key.pem。生成的证书写入默认文件cert.pem/priv.pem建议通过-out-cert/-out-priv指向 testdata 中期望的文件名如ec-workload-cert.pem以便纳入版本管理供测试引用。证书模板底层原理无论哪种模式工具最终都会组装util.CertOptions并调用 GenCertKeyFromOptions若ECSigAlg ECDSA按所选曲线生成 ECDSA 密钥对随后genCert内部以x509.CreateCertificate产出证书若非 CA 证书默认KeyUsage为DigitalSignature | KeyEncipherment并在-server/-client置位时分别追加serverAuth/clientAuth扩展用途模板中BasicConstraintsValid恒为trueNotBefore取-start-date或当前时间NotAfter NotBefore TTLSAN 由 san.go 中的BuildSubjectAltNameExtension构造成 X.509 扩展写入证书。这里有一个常见疑惑-san与-host有什么区别从模板生成代码看-host的值会进入BuildSubjectAltNameExtension作为扩展写进ExtraExtensions自签名/-ca场景身份的核心载体而-san的值则被strings.Split(options.DNSNames, ,)解析后填入证书标准的DNSNames字段见 generate_cert.go。README 示例仅需一张带简单 SAN 的叶子证书因此使用-san watt最为直接。输出环节值得留意文件权限证书写入时权限为0o644私钥写入时权限为0o600见 saveCreds确保私钥文件仅当前用户可读写。ECC 私钥以EC PRIVATE KEY类型的 PEM 块落盘非 PKCS#8这一点可从 crypto.go 中定义的 PEM block 类型常量得到印证。testdata 目录里的 ECC 夹具如何被测试消费generate_cert产出的 ECC 证书在security/pkg/pki/util的测试中确实被作为 EC 用例消费。以 keycertbundle_test.go 为例文件顶部定义了一批测试常量其中ecRootCertFile ../testdata/ec-root-cert.pem ecRootKeyFile ../testdata/ec-root-key.pem ecClientCertFile ../testdata/ec-workload-cert.pem ecClientKeyFile ../testdata/ec-workload-key.pem它们用于KeyCertBundle的加载与校验测试验证同时持有EC 根证书 EC 客户端证书时NewKeyCertBundleFromPem等逻辑能正确处理椭圆曲线密钥。测试中通过bundle.GetAllPem()取出的证书/私钥/链/根必须与预期一致这直接依赖 testdata 中 PEM 夹具的准确性——这正是 README 强调用工具生成、不用手工拼的工程原因。除了 ECC 证书security/pkg/pki/testdata/还沉淀了大量其他测试资产多级 CA 目录multilevelpki/root-cert.pem、int-cert.pem、int-cert-chain.pem等、SPIFFE 系列证书spiffe-root-cert-1.pem、spiffe-workload-cert.pem、CRL 目录以及大量负向用例cert-parse-fail.pem、cert-verify-fail.pem、expired-cert.pem、key-parse-fail.pem、key-mismatch.pem等。这些文件配合 crypto_test.go、verify_cert_test.go 覆盖了证书解析、链验证、过期/失败路径等单元测试分支。当需要新增 EC 相关测试数据时应遵循同一模式先调整generate_cert参数重新签发再提交生成物而非直接编辑 PEM。延伸citadel 模式与 CSR 生成器除了self-signed与signer两种测试常用模式工具还内置citadel模式signCertFromCitadel通过执行kubectl get secret -n istio-system istio-ca-secret -o json拉取 Istio CA Secret 中的ca-cert.pem与ca-key.pem常量定义见 security/pkg/pki/ca 下的 CA 逻辑再以真实网格 CA 身份签发证书适合在已部署 Istio 的环境中做联调验证。与generate_cert配套的还有 security/tools/generate_csr用于独立生成证书签名请求CSR而generate_cert内部依赖的util.GenCertFromCSR见 generate_cert.go则展示了从 CSR 到签发证书的完整链路其中还会用ClockSkewGracePeriod2 分钟把证书NotBefore向前回拨以容忍时钟偏差并用签发者证书的NotAfter对叶子证书有效期做截断保护。这些机制共同保障了 Istio 证书体系中CA 签发叶子证书路径在测试中的可复现性。小结围绕security/pkg/pki/testdata/README.md可以提炼出一条完整的 Istio 测试证书工作流用go run main.go -ec-sig-alg ECDSA -ca true生成 ECC 自签名根证书CA用-mode signer配合-signer-cert/-signer-priv以及-san签发工作负载/客户端证书通过-out-cert/-out-priv将产物落入 security/pkg/pki/testdata供 pki/util 的单元测试引用涉及真实环境联调时可切换到citadel模式直接使用集群内的istio-ca-secret作为签发源。理解这份 README 与其背后的工具实现不仅能帮助你复现仓库内全部 ECC 测试夹具也为在 Istio 周边项目中构建自己的证书测试数据体系提供了可参考的工程范式。【免费下载链接】istioConnect, secure, control, and observe services.项目地址: https://gitcode.com/GitHub_Trending/is/istio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表