Проблема:
Когда я подписываю сообщение сертификатом, который используется для веб-сервера HTTPS, OpenSSL не хочет проверять его снова.
Подписание сообщения:
echo "TestMessage" | openssl smime \ -sign \ -inkey server-key.pem \ -signer server-crt.pem \ -certfile server-crt.pem \ -noattr -nodetach \ -outform DER \ -out signedmessage.dat
Проверка сообщения:
openssl smime \ -verify \ -in signedmessage.dat \ -inform DER \ -signer server-crt.pem \ -CAfile ca-crt.pem \ Verification failure 34379118248:error:21075075:PKCS7 routines:PKCS7_verify:certificate verify error:/usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/pkcs7/pk7_smime.c:342:Verify error:unsupported certificate purpose
Теперь я знаю, что мне следовало подписать свое сообщение, используя сертификат, который позволяет эту цель.
Но есть ли там каким-либо способом обойти эту проверку и проверить подпись?
Вот как были созданы CA и сертификат:
Создание CA:
openssl req -x509 -new -newkey rsa:4096 -keyout ca-key.pem -out ca-crt.pem
Создание сертификата:
openssl req -new -newkey rsa:4096 -keyout server-key.pem -out server-csr.pem -nodes
openssl ca -config openssl.cnf -extensions server -cert ca-crt.pem -keyfile ca-key.pem -in server-csr.pem -out server-crt.pem
Определение расширения в openssl.cnf:
[ server ] extendedKeyUsage = serverAuth keyUsage = digitalSignature, keyEncipherment ...
Openssl smime в режиме проверки передает параметр -purpose
вызову openssl verify. Следовательно, вы должны иметь возможность добавить -purpose sslserver
и получить его для проверки. Я тестировал это на версии 1.0.2d, и она работала хорошо.