PKI 学习笔记以及Cert证书使用常用命令CheatSheet 2024-05-30 12:05:08 Steven Xeldax [TOC] ## PKI简介 PKI(Public Key Infrastructure,公钥基础设施)是一种用于管理公钥加密体系的框架,旨在确保网络通信的安全性和可靠性。PKI 提供了一套标准化的流程和技术,用于生成、存储、分发、验证和撤销数字证书,以及管理公钥和私钥。 PKI 的主要组成部分包括: 数字证书(Digital Certificates):数字证书是用于验证公钥拥有者身份的电子文档。它包含了公钥、持有者信息、颁发者信息以及证书有效期等信息。数字证书由信任的证书颁发机构(CA,Certificate Authority)签发。 证书颁发机构(Certificate Authority,CA):CA 是负责颁发、管理和认证数字证书的权威实体。CA 通过数字签名的方式对证书进行签发,以确保证书的真实性和完整性。 注册机构(Registration Authority,RA):RA 是负责用户身份验证和注册的实体。RA 通常与 CA 配合工作,负责验证用户的身份信息,然后将验证结果传递给 CA 进行证书的签发。 证书吊销列表(Certificate Revocation List,CRL):CRL 是包含已被吊销证书序列号的列表,用于通知用户某些证书的不再有效。用户可以通过查询 CRL 来检查证书的有效性。 证书存储设施(Certificate Store):证书存储设施用于存储和管理数字证书。通常包括证书库和密钥库,用于存储证书和私钥。 数字签名(Digital Signature):数字签名是用于验证文档完整性和真实性的加密技术。数字签名由私钥生成,可以通过公钥验证。 PKI 的核心思想是通过公钥加密技术和数字证书来建立信任关系,确保通信的机密性、完整性和身份认证。通过 PKI,用户可以安全地进行加密通信、数字签名、身份认证等操作,从而保护信息安全和网络通信的可靠性。 ## 证书签发过程 PKI 证书的签发过程通常涉及以下步骤: 用户申请证书:用户首先向证书颁发机构(CA)提交证书申请。在证书申请中,用户需要提供个人或组织的身份信息,包括姓名、电子邮件地址、公钥等。 身份验证:CA 或其合作的注册机构(RA)对用户的身份信息进行验证。这通常包括核对身份证件、联系信息验证等步骤,以确保申请者的身份真实有效。 生成密钥对:用户生成一对公钥和私钥。私钥用于签署数据和解密信息,而公钥用于加密数据和验证数字签名。 生成证书请求(CSR):用户使用私钥生成证书请求(Certificate Signing Request,CSR)。CSR 包含用户的公钥、身份信息以及其他需要包含在证书中的信息。 提交证书请求:用户将 CSR 提交给 CA。CA 将对 CSR 进行审查,验证用户身份和公钥的有效性。 证书签发:经过验证后,CA 使用自己的私钥对用户的公钥和身份信息进行签名,生成数字证书。该数字证书包含用户的公钥、身份信息、证书有效期、CA 的信息以及数字签名等。 证书颁发:CA 将签名后的数字证书发送给用户。用户收到数字证书后,可以将其存储在证书库中,并使用其中包含的公钥进行加密通信、数字签名等操作。 证书更新和吊销:证书有一定的有效期限,用户需要在证书到期前向 CA 申请更新证书。如果证书被盗用或用户不再需要该证书,用户可以向 CA 请求吊销证书,CA 将在证书吊销列表(CRL)中发布被吊销证书的信息。 整个过程中,CA 扮演着关键的角色,负责验证用户身份、签发数字证书,并确保数字证书的安全性和可靠性。用户在使用 PKI 证书时,可以通过数字证书验证对方身份、保障通信安全,从而建立信任关系。 对于PKI的证书分发常见的方法有: ### SCEP 参考https://www.cisco.com/c/zh_cn/support/docs/security-vpn/public-key-infrastructure-pki/116167-technote-scep-00.html 管理员提前创建注册码,然后客户端使用注册码自动注册证书。 ### ACME 参考https://wsgzao.github.io/post/acme/ 他的认证方式实际就是你如何证明你是该域名的拥有者。比如在网站目录下放置一个文件,CA访问该域名验证这个文件,与你的请求比对,即可验证你是网站拥有者;或者直接将自己的信息写到dns记录中。 所以他只限于TLS/SSL证书,或者说该证书必须与域名挂钩。 ### Windows ADCS 通过域控的方式下发证书 ## PKI 多层CA架构 PKI(Public Key Infrastructure,公钥基础设施)多层CA架构是一种层级化的证书颁发体系,通过在不同层级的证书颁发机构(CA)之间建立信任链,实现证书的签发、验证和信任传递。多层CA架构通常包括根证书机构、中间证书机构和终端用户证书等级,每个级别的CA负责管理特定范围的证书签发和验证。 以下是多层CA架构的一般组成和工作原理: 根证书机构(Root CA):根证书机构是整个PKI架构的最高级别,拥有最高的信任级别。根CA自签名其自己的证书,其公钥被预装在操作系统或浏览器中,作为信任锚点。根CA通常不直接签发终端用户证书,而是签发中间证书机构的证书。 中间证书机构(Intermediate CA):中间证书机构位于根证书机构和终端用户之间,可以有多个级别。中间CA从根CA处获得证书,并用自己的私钥对终端用户证书进行签名。中间CA的证书链可以通过根CA的证书验证,从而建立信任关系。 终端用户证书(End-entity Certificate):终端用户证书是由中间CA签发的最终用户证书。终端用户证书用于对用户、服务器或设备的身份进行认证,以确保通信的安全性和可靠性。 在多层CA架构中,信任链的建立是通过验证证书链中每个级别的CA证书来实现的。客户端在接收到终端用户证书时,可以通过验证证书链中每个CA证书的有效性和信任级别,来确保证书的真实性和完整性。 多层CA架构提供了一种灵活且可扩展的方式来管理大规模的证书签发和验证。不同级别的CA可以分担不同的责任,提高了系统的安全性和可管理性。通过建立多层CA架构,PKI可以更好地适应复杂的网络环境和安全需求,确保数字证书的安全和信任传递。 ![](/download/9bbfdc50-d3a7-4628-a613-95da6f8c5c67.png) ## PKI的应用 SSL/TLS加密通信:PKI用于支持SSL/TLS协议,保护Web浏览器和服务器之间的安全通信。通过SSL/TLS证书,浏览器可以验证服务器的身份,并加密通信内容,防止数据被窃取或篡改。 数字证书签名:PKI用于生成和验证数字签名,确保数据的完整性和真实性。数字证书签名可以用于电子文档、电子邮件、代码签名等领域,验证信息的发送者身份和数据未被篡改。 设备证书:设备证书用于验证设备的身份,确保设备在网络中的唯一性和真实性。通过设备证书,其他设备或服务器可以验证设备的身份,防止设备冒充或未经授权的设备接入网络。 ## PKI:EJBCA 社区版本 https://hub.docker.com/r/keyfactor/ejbca-ce > docker run -it --rm -p 80:8080 -p 443:8443 -h mycahostname -e TLS_SETUP_ENABLED="simple" keyfactor/ejbca-ce ## EJBCA 使用手册 https://blog.csdn.net/u011391839/article/details/89471514 https://blog.csdn.net/mengo1234/article/details/102309413 ## Cert 命令cheatsheet ``` 1. 证书 1.1 合成证书链 cat issuingCA intermidateCA rootCA > certchain.pem 1.2 OpenSSL合成P12/PFX文件 #从证书文件和私钥合成 openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile more.crt # 从p7b合成 openssl pkcs7 -print_certs -in certificate.p7b -out certificate.crt 1.3 OpenSSL解析P12/PFX文件 openssl pkcs12 -in certificate.p12 -out key.pem -nocerts -nodes openssl pkcs12 -in certificate.p12 -out cert.pem -nokeys # openssl pkcs12 -in certificate.p12 -out cert.pem -clcerts -nokeys 1.4 OpenSSL私钥保护 openssl pkcs8 -topk8 -inform PEM -outform DER -in key.pem -out passed_key.pem -nocrypt openssl pkcs8 -topk8 -inform PEM -outform PEM -in key.pem -out passed_key.pem # 转换为pkcs8格式 openssl pkcs8 -topk8 -nocrypt -outform der -in key.pem -out key.p8 # 为RSA密钥增加口令保护 openssl rsa -in RSA.pem -des3 -passout pass:123456 -out E_RSA.pem openssl ec -aes256 -in key.pem -out key1.pem # 为RSA密钥去除口令保护 openssl rsa -in E_RSA.pem -passin pass:123456 -out P_RSA.pem 1.5 OpenSSL查看证书内容和CRL openssl x509 -in cert.pem -noout -text openssl x509 -in -inform DER cert.der -noout -text openssl crl -inform DER -text -noout -in xxxx.crl 1.6 OpenSSL证书格式转换 # PEM to DER openssl x509 -outform der -in certificate.pem -out certificate.der # DER to PEM openssl x509 -inform der -in certificate.cer -out certificate.pem # P7B to PEM openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer 1.7 OpenSSL生成证书请求文件或自签名证书 # 生成私钥和证书请求文件 openssl req -newkey rsa:2048 -new -nodes -keyout my.key -out my.csr # 生成自签名证书 openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem #查看CSR文件 openssl req -in my.csr -noout -text #续签证书, cert.key=key.pem openssl x509 -x509toreq -in cert.pem -out cert.csr -signkey cert.key openssl x509 -req -days 3650 -in cert.csr -out cert.new.pem -signkey cert.key 1.8 BKS/JKS 格式 # P12 to BKS keytool -importkeystore -srckeystore client.p12 -srcstoretype pkcs12 -destkeystore client.bks -deststoretype bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-ext-jdk15on-158.jar # P12 to JKS keytool -importkeystore -srckeystore D:\server.pfx -destkeystore D:\server.jks - srcstoretype PKCS12 -deststoretype JKS # Import CA Certificate To JKS keytool -import -alias evca -keystore d:\server.jks -trustcacerts -file d:\CFCA_EV_CA.cer # 直接使用keytool生成并分别为store和key设置不同的密码 keytool -genkey -alias newkey -keyalg RSA -keysize 2048 -keystore wso2carbon.jks -dname "CN=localhost, OU=IT,O=ABC,L=SL,S=WS,C=LK" -storepass wso2carbon -keypass wso2carbon # 查看bks格式证书 keytool -list -rfc -keystore updatesdkcas.bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath ../../../zips/bcprov.jar -storetype BKS keytool -list -v -keystore updatesdkcas.bks -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath ../../../zips/bcprov.jar -storetype BKS # JKS show keystore keytool -v -list -keystore truststore.jks 2. 密钥/Key 2.1 生成 Key或者Key Pair # AES KEY openssl enc -aes-256-cbc -k secret -P -md sha256 openssl enc -aes-256-gcm -nosalt -p -in private-keyset.cfg -out test.out # 特定曲线的Key openssl ecparam -name prime256v1 -out prime256v1.pem # SM2 KEY openssl ecparam -list_curves | grep SM2 # 如果查询结果有内容,则说明该版本支持SM2参数,也就可以生成SM2的公私钥对。 # 1.创建EC参数和原始私钥文件: openssl ecparam -out ec_param.pem -name SM2 -param_enc explicit -genkey #注:生成完成后可以查看一下EC私钥信息: openssl ecparam -in ec_param.pem -text #然后验证一下参数: openssl ecparam -in ec_param.pem -check # 2.将原始的私钥文件,转换为pkcs8格式: openssl pkcs8 -topk8 -inform PEM -in ec_param.pem -outform pem -nocrypt -out pri_key_pkcs8.pem # 3.利用原始的私钥,生成对应的公钥: openssl ec -in ec_param.pem -pubout -out pub_key.pem # 至此SM2的秘钥对已经生成结束,pri_key_pkcs8.pem是SM2私钥,而pub_key.pem是公钥。 # RSA 查看私钥和公钥是否匹配 #RSA算法 openssl x509 -noout -modulus -in cert.crt | openssl md5 openssl rsa -noout -modulus -in privkey.txt | openssl md5 # SM2 算法 openssl pkey -in ec_param.pem -text openssl pkey -in pub_key.pem -text -pubin 2.2 生成ssh/sftp Key ssh-keygen -f privatekeyname -C commentname # 转换为PEM 格式 ssh-keygen -p -m PEM -f privatekeyname # 制定算法和长度 ssh-keygen -t rsa -b 4096 -o -a 100 2.3 生成随机数 openssl rand -hex 13 2.4 加密/解密 2.4.1 对称 # 命令行输入,密码123456 openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass pass:123456 # 文件输入,密码123456 echo 123456 > passwd.txt openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass file:passwd.txt # 环境变量输入,密码123456 export passwd=123456 openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass env:passwd # 从文件描述输入 openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass fd:1 # 从标准输入输入 openssl enc -aes-128-cbc -in plain.txt -out out.txt -pass stdin 2.4.2 非对称加密 # 使用RSA作为密钥进行加密,实际上使用其中的公钥进行加密 openssl rsautl -encrypt -in plain.txt -inkey RSA.pem -passin pass:123456 -out enc.txt # 使用RSA作为密钥进行解密,实际上使用其中的私钥进行解密 openssl rsautl -decrypt -in enc.txt -inkey RSA.pem -passin pass:123456 -out replain.txt # 公钥进行加密 openssl rsautl -encrypt -in plain.txt -inkey pub.pem -pubin -out enc1.txt # 进行解密 openssl rsautl -decrypt -in enc1.txt -inkey RSA.pem -passin pass:123456 -out replain1.txt 2.5 签名/验签 # 提取PCKS8格式的私钥 openssl pkcs8 -topk8 -in RSA.pem -passin pass:123456 -out pri.pem -nocrypt # 使用RSA密钥进行签名,实际上使用私钥进行加密 openssl rsautl -sign -in plain.txt -inkey RSA.pem -passin pass:123456 -out sign.txt # 使用RSA密钥进行验证,实际上使用公钥进行解密 openssl rsautl -verify -in sign.txt -inkey RSA.pem -passin pass:123456 -out replain.txt # 使用私钥进行签名 openssl rsautl -sign -in plain.txt -inkey pri.pem -out sign1.txt # 使用公钥进行验证 openssl rsautl -verify -in sign1.txt -inkey pub.pem -pubin -out replain1.txt 2.6 哈希/摘要 openssl dgst -md5 a.txt openssl sha512 a.txt # 摘要并签名 openssl dgst -md5 -hex -sign key.pem a.txt # 验证签名 openssl dgst -md5 -out md5_nohex.sign -sign key.pem a.txt openssl dgst -md5 -hex -out md5_hex.sign -sign key.pem a.txt 2.7 编码/解码 # 对文件进行base64编码 openssl enc -base64 -in plain.txt -out base64.txt # 对base64格式文件进行解密 openssl enc -base64 -d -in base64.txt -out plain2.txt 3. GPG 3.1 加密/解密 gpg -a --symmetric --cipher-algo AES256 xxx.tar.gz gpg -a --output xxxx.tar.gz --decrypt xxxx.tar.gz.asc 3.2 签名/验签 gpg --output doc.sig --sign doc gpg --output doc --decrypt doc.sig gpg --verify doc.sig doc 4. Misc pdf,docx,excel,ppt,video可以采用文件加密的方式,也可以采用密码口令保护的方式,除却本身自带的密码保护口令,还可以通过压缩包的密码口令来保护。 4.1 文档加密 4.2 视频加密/解密 #加密 ffmpeg -i SampleVideo_1280x720_1mb.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key 76a6c65c5ea762046bd749a2e632ccbb -encryption_kid a7e61c373e219033c21091fa607bf3b8 SampleVideo_1280x720_1mb_encrypted.mp4 # 解密 ffplay SampleVideo_1280x720_1mb_encrypted.mp4 -decryption_key 76a6c65c5ea762046bd749a2e632ccbb 4.2 Keytool cli使用 pass ``` ## 参考资料 https://learn.microsoft.com/zh-cn/mem/intune/protect/microsoft-cloud-pki-fundamentals https://blog.csdn.net/huakai_sun/article/details/79988465