我知道可以按照以下方式使用 OpenSSL 将 PEM(x509)证书转换为纯文本:
openssl x509 -in some.pem -text
但是我找不到 openssl pkcs12 命令的 -text 选项。到目前为止,我发现最接近的选项是 -info 选项,但它的输出信息量远不如 x509 -text 选项。
PKCS#12 证书文件是否存在某些限制,不允许获取纯文本信息?
我知道可以按照以下方式使用 OpenSSL 将 PEM(x509)证书转换为纯文本:
openssl x509 -in some.pem -text
但是我找不到 openssl pkcs12 命令的 -text 选项。到目前为止,我发现最接近的选项是 -info 选项,但它的输出信息量远不如 x509 -text 选项。
PKCS#12 证书文件是否存在某些限制,不允许获取纯文本信息?
我正在创建一个 OpenSSL 配置,该配置应有助于生成 Hyperledger Fabric Identity 和 TLS 证书的证书签名请求(我们不能在我们的组织中使用 Fabric CA)。我当前的配置生成如下 CSR:
openssl req -in ecdsa_ident_req.pem -text -noout
Certificate Request:
Data:
Version: 1 (0x0)
Subject: C=NL, L=RD, OU=ll, CN=33
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:d2:5b:38:77:b4:8e:1d:97:ab:fa:82:8a:5b:5e:
8f:d5:f4:8f:5a:7e:fb:0b:c1:1e:15:31:cf:e6:47:
9c:91:ce:5d:2b:9d:6b:7c:91:a9:ba:35:3f:7c:5c:
d9:a4:5d:d9:51:6e:65:73:a0:b3:c9:79:af:85:90:
a6:19:4e:76:f5
ASN1 OID: prime256v1
NIST CURVE: P-256
Attributes:
Requested Extensions:
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation
1.2.3.4.5.6.7.8.1:
.l{"attrs":{"abac.init":"true","admin":"true","hf.Affiliation":"","hf.EnrollmentID":"Admin","hf.Type":"user"}}
Signature Algorithm: ecdsa-with-SHA256
Signature Value:
...
令人意想不到的是.l
属性值中的前缀1.2.3.4.5.6.7.8.1
。
我需要在设置中进行哪些更改才能将值设置为不带该.l
前缀的 JSON 字符串。
我使用的是openssl版本
OpenSSL 3.2.1 30 Jan 2024 (Library: OpenSSL 3.2.1 30 Jan 2024)
我使用生成的 CSR
export ISHARE_ATTRS="{\"attrs\":{\"abac.init\":\"true\",\"admin\":\"true\",\"hf.Affiliation\":\"\",\"hf.EnrollmentID\":\"Admin\",\"hf.Type\":\"user\"}}"
openssl req -config ./openssl.cnf -new -newkey ec:ec_param.pem -section req_ecdsa_identity_admin -keyout ecdsa_ident_key.pem -out ecdsa_ident_req.pem
其内容opensll.cnf
是:
# Barebones openssl configuration that can be used to generate CSRs for
# - iSHARE Satellite Identity/Enrollment certificates
# - iSHARE Satellite TLS certificates
# Resources/documentation
# - https://www.openssl.org/docs/man3.0/man5/config.html
openssl_conf = openssl_init
[ openssl_init ]
alg_section = evp_properties
engines = engines
oid_section = OID
providers = providers
random = random
ssl_conf = ssl_configuration
[ engines ]
[ evp_properties ]
[ OID ]
iShareAttributesExtension = 1.2.3.4.5.6.7.8.1
[ providers ]
[ random ]
[ ssl_configuration ]
server = tls_server_config
client = tls_client_config
system_default = tls_system_default
[ tls_client_config ]
# configuration for SSL/TLS clients
RSA.Certificate = client-rsa.pem
ECDSA.Certificate = client-ecdsa.pem
[ tls_server_config ]
# configuration for SSL/TLS servers
RSA.Certificate = server-rsa.pem
ECDSA.Certificate = server-ecdsa.pem
[ tls_system_default ]
MinProtocol = TLSv1.2
MinProtocol = DTLSv1.2
[ req_dn_identity ]
countryName = Country Name (2 letter code)
countryName_default = NL
countryName_min = 2
countryName_max = 2
localityName = Locality Name (eg, city)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, YOUR name)
commonName_max = 64
[ req_dn_tls ]
countryName = Country Name (2 letter code)
countryName_default = NL
countryName_min = 2
countryName_max = 2
localityName = Locality Name (eg, city)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (eg, hostname)
commonName_max = 64
[ req_ecdsa_identity_admin ]
distinguished_name = req_dn_identity
req_extensions = x509v3_identity
[ req_ecdsa_identity_user ]
distinguished_name = req_dn_identity
req_extensions = x509v3_identity
[ req_ecdsa_identity_peer ]
distinguished_name = req_dn_identity
req_extensions = x509v3_identity
[ req_ecdsa_identity_orderer ]
distinguished_name = req_dn_identity
req_extensions = x509v3_identity
[ req_ecdsa_tls ]
distinguished_name = req_dn_tls
req_extensions = x509v3_ecdsa_tls
[ req_rsa_tls ]
distinguished_name = req_dn_tls
default_bits = 4096
req_extensions = x509v3_rsa_tls
[ x509v3_identity ]
basicConstraints = critical, CA:FALSE
keyUsage = digitalSignature,nonRepudiation
iShareAttributesExtension = ASN1:UTF8String:$ENV::ISHARE_ATTRS
[ x509v3_ecdsa_tls ]
basicConstraints = critical, CA:FALSE
keyUsage = keyEncipherment, dataEncipherment, keyAgreement
extendedKeyUsage = clientAuth, serverAuth
[ x509v3_rsa_tls ]
basicConstraints = critical, CA:FALSE
keyUsage = keyEncipherment, dataEncipherment, keyAgreement
extendedKeyUsage = clientAuth, serverAuth
业务合作伙伴需要客户端证书才能访问他们的某些 API。
我使用以下命令使用 OpenSSL 生成了一个证书:
openssl req -x509 -newkey rsa:4096 -keyout mykey.pem -out mycert.pem -sha256 -days 365
业务合作伙伴说证书包含证书的“基本约束”部分中的内容,并且证书需要完全没有基本约束。他们还向我展示了一张有效证书的屏幕截图,该证书没有任何基本限制。
我尝试添加参数-addext "basicConstraints=CA:FALSE,pathlen:0"
,但这生成了一个包含其中两个部分的证书,看起来它可能无效:
如何在没有基本约束部分的情况下生成客户端证书?
我从 GoDaddy 下载了 ssl 证书文件,其中包含 .pem 文件、.crt 文件和 .p7b 文件。我有一个以 .key 扩展名生成的私钥。我需要将相同的分配给从 Godaddy 收到的证书,并在 IIS 证书中安装相同的证书。
我已经从 .crt sslcertificate.cer 创建了 .cer 文件
问题实际上是,当我使用“完整证书请求”选项在 IIS 中安装证书并添加它在证书列表中显示的详细信息时。但是当刷新或转到其他选项并返回到证书列表时,我看不到刚刚添加的新证书,它消失了。
通过谷歌搜索,我可以理解问题是由于私钥与证书无关。当我检查证书本身时,我发现没有显示钥匙图标。我尝试通过 openssl 命令添加以使其成为还附加了密钥的 p12K 文件,但“其结果是需要密码”并根据搜索结果退出命令行,它应该要求输入密码(我怀疑是否有密码已经在该密钥文件或其他文件中设置)。我也尝试过 certutil -repairstore 我的“序列号”命令,但它要求连接智能设备。
首先,我尝试创建一个新密钥,因为这个私钥是一个旧密钥,并且在创建时不确定是否有人在其中输入了密码,这就是密码询问的原因。所以我创建了一个新的密钥文件“newkey.key”并尝试用它制作 .pfx 文件,但它显示这个密钥不是与 .cer/crt 文件关联的正确密钥。然后我尝试从我收到的 pem 文件创建一个 .key 文件,但它仍然说无法从 pem 文件中检索数据
我正在尝试使用 StackOverflow 答案中的步骤自动创建证书。
这些是我正在尝试的命令:
openssl genrsa -des3 -out ca.key 2048
openssl req -new -key ca.key -out ca-cert-request.csr -sha256
openssl x509 -req -in ca-cert-request.csr -signkey ca.key -out ca-root-cert.crt -days 365 -sha256
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server-cert-request.csr -sha256
openssl x509 -req -in server-cert-request.csr -CA ca-root-cert.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360
在第 2 步中,我将 Common Name 留空。在第 5 步中,我尝试localhost
使用通用名称的实际主机名。
当我运行mosquitto_pub -h localhost -t mqttsTest42 -p 8883 -m testMessage --cafile "C:\Certificates\ca-root-cert.crt" --cert "C:\Certificates\server.crt" --key "C:\Certificates\server.key"
它输出这个:
Connection error: Connection Refused: not authorised.
Error: The connection was refused.
如果我手动运行 Mosquitto,它会给出:
C:\Program Files\mosquitto>mosquitto -c mosquitto.conf -v
1669685112: mosquitto version 2.0.14 starting
1669685112: Config loaded from mosquitto.conf.
1669685112: Opening ipv6 listen socket on port 8883.
1669685112: Opening ipv4 listen socket on port 8883.
1669685112: mosquitto version 2.0.14 running
1669685121: New connection from ::1:49375 on port 8883.
1669685121: Sending CONNACK to auto-7484C261-71E1-F653-3807-74471901380A (0, 5)
1669685121: Client auto-7484C261-71E1-F653-3807-74471901380A disconnected, not authorised.
我曾经与 Mosquitto 和另一位经纪人一起工作过。在我努力实现自动化的过程中,我改变了太多东西,现在甚至不能让上面最初的六个步骤为我工作了。
我目前使用的是 mosquitto 版本2.0.14
和 OpenSSL 版本3.0.7 1 Nov 2022 (Library: OpenSSL 3.0.7 1 Nov 2022)
。我已经尝试了另一个版本的 Mosquitto 和另一个版本的 OpenSSL。
我创建的批处理文件在这里。
我的 openssl.cnf 在这里。
我的 mosquitto.conf 包含这些行:
listener 8883
certfile C:\Certificates\server.crt
keyfile C:\Certificates\server.key
cafile C:\Certificates\ca-root-cert.crt
接下来我应该尝试什么?
我正在尝试使用命令行工具来匹配 Plex.app 为电影文件计算的哈希值(显然,它是电影第一个块(4k)而不是整个电影的 SHA1 哈希)。
我尝试使用以下命令使用命令行工具获取哈希,但不出所料,这两个哈希不匹配。
file="/path/to/mp4"
dd bs=4k count=1 if="$file" | openssl sha1
1+0 records in
1+0 records out
4096 bytes transferred in 0.000012 secs (341333333 bytes/sec)
7785d5d6d611a27ac03dfdff8a2c89e9ffeffa3b
file="/path/to/mp4"
head -c 4096< "$file" | openssl sha1
7785d5d6d611a27ac03dfdff8a2c89e9ffeffa3b
使用ffprobe
我意识到该 mp4 文件开头的大部分数据是编码设置而不是视频流。让我觉得无论 Plex 使用什么进程,它都可能避免文件的编码设置,因为它们可能完全相同。
请记住,这些值与尝试复制其哈希计算的适当工具不匹配的原因可能有很多。
我正在实现一个包含 DES 和 3DES 功能的支持库。作为验证步骤,我使用它openssl
来检查我的结果。对于一个简单的测试,我这样做了:
echo -n "AAAAAAAA" | openssl enc -e -des-ecb -nosalt -pass pass:AABBCCDD | xxd
00000000: 2976 3faf 5e27 7187 5897 c640 c38c cf8b )v?.^'q.X..@...
即 ECB mod、plaintext AAAAAAAA
、keyAABBCCDD
和 no salting。但是这里有两件事让我觉得很奇怪。
(1) 对于 64 位输入和 64 位块大小,我希望输出具有与输入相同的长度
(2) 如果我将输入加倍为 128 位(所有 A,块长度的两倍),我实际上得到 24 字节的密文
$ echo -n "AAAAAAAAAAAAAAAA" | openssl enc -e -des-ecb -nosalt -pass pass:AABBCCDD | xxd
00000000: 2976 3faf 5e27 7187 2976 3faf 5e27 7187 )v?.^'q.)v?.^'q.
00000010: 5897 c640 c38c cf8b X..@....
在进行最后一个实验时,我注意到密文确实在块大小边界上重复(参见2976 3faf 5e27 7187
重复)。但是当达到这个阈值时,我们会得到额外的 8 个字节的密文。即,使用 7 个 A 给出 8 个字节的密文,但 8 个 A 给我们 16 个字节。所以对这个边界条件似乎有一些奇怪的处理?
无论如何,我检查了一些随机的在线 DES 工具,但没有一个与 openssl 提供的相匹配——但它们都相互匹配。从这些工具中,我认为上面第一个示例的正确密文是
54 55 ab a4 a2 b0 83 38
或者他们都以同样的方式错了。这里发生了什么?
我正在使用 windows openssl 版本 3.0.1 14。问题是当文件名包含非英文字符时,它无法加密文件并出现以下错误:
C:\Users\XXX\Desktop>openssl aes-256-cbc -e -salt -in "C:\Users\XXX\Desktop\test\试试.txt" -out "C:\Users\XXX\Desktop\test\ENCRYPTING.txt" -k 12230000000000000000000000000000 -iv F1230000000000000000000000000000
Can't open "C:\Users\XXX\Desktop\test\??.txt" for reading, Invalid argument
B8280000:error:8000007B:system library:BIO_new_file:Unknown error:crypto\bio\bss_file.c:67:calling fopen(C:\Users\lishi\Desktop\test\??.txt, rb)
B8280000:error:10080002:BIO routines:BIO_new_file:system lib:crypto\bio\bss_file.c:77:
我使用的终端是windows命令提示符,我验证了这个中文文件可以在cmd中使用发出成功打开:
C:\Users\XXX\Desktop>notepad C:\Users\XXX\Desktop\test\试试.txt
我需要在 openssl 端做任何配置以支持 utf8 吗?
Ed25519 私钥可以通过做openssl genpkey -algorithm ed25519 -outform PEM -out private.pem
. 我的问题是......使用 OpenSSL 有没有办法从私钥中获取公钥?
使用 RSA 私钥,您可以做到openssl rsa -in private.pem -pubout
。这给出了一个与 RFC5280 中的 SubjectPublicKeyInfo 相对应的密钥(至少它对我有用)。
但是我怎样才能获得 Ed25519 密钥的类似公钥?我想我可以用私钥生成一个 CSR 并从 CSR 中获取它,但这似乎需要做很多工作。当然,这比运行单个命令要多得多……
grief@rocket:/$ curl https://wrong.host.badssl.com
curl: (60) SSL: no alternative certificate subject name matches target host name 'wrong.host.badssl.com'
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
grief@rocket:/$ echo "Q" | openssl s_client wrong.host.badssl.com:443 2>&1|grep Verification
Verification: OK
如何测试证书是否与使用的主机名匹配openssl (1)
?