Есть ли способ цифровой подписи сертификата x509 или любого документа с помощью openssl?
Цифровая подпись для файла с помощью openssl
Ответ 1
Да, dgst и rsautl компонента OpenSSL может использоваться для вычисления подписи с использованием пары ключей RSA.
Заключение:
openssl dgst -sha256 data.txt > hash
openssl rsautl -sign -inkey privatekey.pem -keyform PEM -in hash >signature
Проверка только подписи:
openssl rsautl -verify -inkey publickey.pem -keyform PEM -in signature
Обновление. Захват комментариев Reto снизу, потому что это важный нюанс. Предположительно, если вам не удастся проверить, вы хотите знать, что подпись была написана на открытом тексте, к которому она прикреплена:
Это может показаться очевидным для некоторых, но: Помните, rsault verify
просто расшифровывает файл signature
. Выход этого вызова гарантированно будет производиться владельцем закрытого ключа, но помимо этого ничего не проверяется. Таким образом, чтобы проверить согласованность data.txt
, вам необходимо восстановить дайджест, а затем сравнить его с выходом openssl rsautl -verify
.
Проверка того, что владелец закрытого ключа ручается за data.txt
:
openssl dgst -sha256 -verify publickey.pem -signature signature data.txt
Для этой операции openssl требует открытого ключа, подписи и сообщения.
Ответ 2
Альтернативный способ подписать/подтвердить сингл, вдохновленный Ответ Андерса Линдаля.
, чтобы подписать
openssl dgst -sha256 -sign snakeoil.key -out some-file.sha256 some-file
, чтобы проверить
# dgst -verify requires the public key
openssl x509 -in snakeoil.crt -pubkey -noout > snakeoil.pub
openssl dgst -sha256 -verify snakeoil.pub -signature some-file.sha256 some-file
# in case of success: prints "Verified OK"
# in case of failure: prints "Verification Failure", return code 1
# or compact (requires a modern shell)
openssl dgst -sha256 \
-verify <(openssl x509 -in snakeoil.crt -pubkey -noout) \
-signature some-file.sha256 some-file
Ответ 3
Чтобы подписал цифровой документ в openssl, он будет работать
Для этого сначала нужно доверять сертификату это будет выглядеть так.
-----BEGIN TRUSTED CERTIFICATE-----
MIIDbjCCAlYCCQCOyunl25ProDANBgkqhkiG9w0BAQUFADB5MQswCQYDVQQGEwJJ
...
-----END TRUSTED CERTIFICATE-----
Затем используйте следующую команду
smime -sign -signer certificate.pem -inkey private.key -in test.txt \
-out test1.txt -from ashish -to singhal