- List all available ssl ca certificates
- 8 Answers 8
- Работа с КриптоПро на linux сервере
- С жесткого диска
- Проверка успешности установки закрытого ключа
- Добавление тестового сертификата
- Удаление сертификата
- Проверка сертификата
- Просмотр всех атрибутов сертификата
- Экспорт сертификатов на другую машину
- Подписание документа ЭЦП
- Проверка подписи ЭЦП
- Получение исходного файла
- Настройка службы точного времени
List all available ssl ca certificates
That means it can not find the corresponding ssl server key in the global system keyring. I want to check this by looking at the list of all system wide available ssl keys on a gentoo linux system. How can I get this list?
8 Answers 8
It’s not SSL keys you want, it’s certificate authorities, and more precisely their certificates.
awk -v cmd='openssl x509 -noout -subject' ' /BEGIN/;' < /etc/ssl/certs/ca-certificates.crt
To get the "subject" of every CA certificate in /etc/ssl/certs/ca-certificates.crt (this works because openssl exits after reading an individual cert block, but awk relaunches openssl on the next print | cmd call).
Beware that sometimes, you get that error when SSL servers forget to provide the intermediate certificates.
Use openssl s_client -showcerts -connect the-git-server:443 to get the list of certificates being sent.
Note that the pathname of the certificates bundle may differ depending on operating system. The directory holding the certs sub-directory is given by the command openssl version -d . The actual certificates file in that directory may additionally have a different name.
// , This does not work on CEntOS 6, but I have added an answer for CEntOS 6 here: unix.stackexchange.com/a/363309/48498
@F.Hauri, The command I gave should work in bash or any shell of the Bourne, rc, or fish families. If put on one line, it would work in any shell that I know, even csh, even the Unix V6 shell.
I agree, your solution is correct and efficient, I've just posted an alternative, using bash's arrays and some pretty output formatting, showing some usefull bash features
Not sure about Gentoo but most distros put their certificates soft-link in system-wide location at /etc/ssl/certs .
- Key files go into /etc/ssl/private
- System-provided actual files are located at /usr/share/ca-certificates
- Custom certificates go into /usr/local/share/ca-certificates
Whenever you put a certificate in one of the above mentioned paths, run update-ca-certificates to update /etc/ssl/certs lists.
It's update-ca-certificates with an additional s (can't edit this myself, as it's just a one-character edit).
I had a requirement to list all the certs on our server and notify if they are due to expire. We came up with this command:
locate .pem | grep "\.pem$" | xargs -I<> openssl x509 -issuer -enddate -noout -in <>
Note that openssl x509 format expects only a single cert in a pem file. Multiple certs if present need to follow some parsing given unix.stackexchange.com/questions/17744/…
A quick way to list all currently trusted CA certificates by openssl (with Ubuntu default directories):
find /etc/ssl/certs -type l -iname "*.0" -exec cat "<>" \; | awk -v cmd='openssl x509 -noout -subject -enddate 2>/dev/null | tr "\n" " " ; echo' '/BEGIN/;;/END/' | sed -r 's:^subject=::' | sort -u
openssl crl2pkcs7 -nocrl -certfile /etc/ssl/certs/ca-certificates.crt | openssl pkcs7 -print_certs -noout | grep subject
Most of the times, when examining ca certificates, you will want (and should) grep with fingerprint . You can also pass the output to less for searching/matching manually.
In general verifying the certificate fingerprint rather than just its name/issuer name/date e.t.c is very important.
# By piping to less you can manually search by hitting '/' cat /etc/ssl/certs/ca-certificates.crt | keytool -printcert 2>/dev/null | grep "^Certificate\[" -A11 | less
Certificate[1]: Owner: C=ES, O=ACCV, OU=PKIACCV, CN=ACCVRAIZ1 Issuer: C=ES, O=ACCV, OU=PKIACCV, CN=ACCVRAIZ1 Serial number: 5ec3b7a6437fa4e0 Valid from: Thu May 05 12:37:37 EEST 2011 until: Tue Dec 31 11:37:37 EET 2030 Certificate fingerprints: SHA1: 93:05:7A:88:15:C6:4F:CE:88:2F:FA:91:16:52:28:78:BC:53:64:17 SHA256: 9A:6E:C0:12:E1:A7:DA:9D:BE:34:19:4D:47:8A:D7:C0:DB:18:22:FB:07:1D:F1:29:81:49:6E:D1:04:38:41:13 Signature algorithm name: SHA1withRSA (weak) Subject Public Key Algorithm: 4096-bit RSA key Version: 3 -- Certificate[2]: Owner: OU=AC RAIZ FNMT-RCM, O=FNMT-RCM, C=ES Issuer: OU=AC RAIZ FNMT-RCM, O=FNMT-RCM, C=ES Serial number: 5d938d306736c8061d1ac754846907 Valid from: Wed Oct 29 17:59:56 EET 2008 until: Tue Jan 01 02:00:00 EET 2030 Certificate fingerprints: SHA1: EC:50:35:07:B2:15:C4:95:62:19:E2:A8:9A:5B:42:99:2C:4C:2C:20 SHA256: EB:C5:57:0C:29:01:8C:4D:67:B1:AA:12:7B:AF:12:F7:03:B4:61:1E:BC:17:B7:DA:B5:57:38:94:17:9B:93:FA Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 4096-bit RSA key Version: 3 -- . .
And since the above command prints also a sequential number for each certificate ( e.g. Certificate[3] ) you can then pick the actual certificate with:
# Let's say you want to pick certificate number 3 awk -v n=3 '/BEGIN CERTIFICATE/ && ++k == n, /END CERTIFICATE/' /etc/ssl/certs/ca-certificates.crt
-----BEGIN CERTIFICATE----- MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQsw CQYDVQQGEwJFUzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgw FgYDVQRhDA9WQVRFUy1RMjgyNjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1S Q00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4MTIyMDA5MzczM1oXDTQzMTIyMDA5 MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQtUkNNMQ4wDAYDVQQL DAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNBQyBS QUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuB BAAiA2IABPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LH sbI6GA60XYyzZl2hNPk2LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oK Um8BA06Oi6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD VR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqGSM49BAMDA2kAMGYCMQCu SuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoDzBOQn5IC MQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJy v+c= -----END CERTIFICATE-----
Работа с КриптоПро на linux сервере
Скопировать в корень дискеты или флэшки сертификат и приватный ключ (из каталога 999996.000 , 999996 - название (alias) контейнера):
cp -R /path/to/key/999996.000 /media/flashdrive/ cp /path/to/cert/client.cer /media/flashdrive/
Выполнить команду по копированию ключа с флэшки на диск, ключ попадет в пользовательское хранилище My .
gate@example.com - то, что прописано в поле E сертификата (можно посмотреть командой keytool --printcert -file /path/to/cert/client.cer ):
csptest -keycopy -src '\\.\FLASH\gate@example.com' -dest '\\.\HDIMAGE\999996'
С жесткого диска
Скопировать приватный ключ в хранилище (контейнер), где - имя пользователя linux:
cp -R /path/to/key/999996.000 /var/opt/cprocsp/keys/username>/
Поставить «минимальные» права:
chmod 600 /var/opt/cprocsp/keys/username>/999996.000/*
Узнать реальное название контейнера:
csptest -keyset -enum_cont -verifycontext -fqcn
Ассоциировать сертификат с контейнером, сертификат попадет в пользовательское хранилище My :
certmgr -inst -file /path/to/file/client.cer -cont '\\.\HDIMAGE\999996'
Если следующая ошибка, нужно узнать реальное название контейнера (см. выше):
Failed to open container \\.\HDIMAGE\ [ErrorCode: 0x00000002]
Установить сертификат УЦ из-под пользователя root командой:
certmgr -inst -store uroot -file /path/to/file/CA.cer
Проверка успешности установки закрытого ключа
Если выводится PrivateKey Link: Yes. Container: HDIMAGE\\999996.000\D7BB , то есть и сертификат, и приватный ключ, а если выводится PrivateKey Link: No - связи нет, и использовать такой контейнер для подписи не удастся.
Добавление тестового сертификата
Добавление работает только на той же машине, и в тот же контейнер, где был сформированы следующий запрос на добавление:
cryptcp -creatrqst -dn 'cn=test' -cont '\\.\hdimage\test' test.csr
Ввести пароль на контейнер test123 .
cryptcp -creatrqst -dn 'e=email@test.ru,cn="тест тест",c=rus,l="москва",o="текст тест"' -cont '\\.\hdimage\myname' myname.csr
cryptcp -instcert -cont '\\.\hdimage\test' certnew.cer
Ввести пароль на контейнер. По-умолчанию: 12345678
Удаление сертификата
Проверка сертификата
1------- Issuer : E=cpca@cryptopro.ru, C=RU, L=Москва, O=ООО КРИПТО-ПРО, CN=УЦ KPИПTO-ПPO Subject : E=info@site.ru, C=RU, L=г. Москва, O="ООО ""Верес""", OU=Руководство, CN=Иванов Иван Иванович, T=Генеральный директор Serial : 0x75F5C86A000D00016A5F SHA1 Hash : 0x255c249150efe3e48f1abb3bc1928fc8f99980c4 Not valid before : 08/12/2014 09:04:00 UTC Not valid after : 08/12/2019 09:14:00 UTC PrivateKey Link : No
Подписание пустого файла (размер 0) проходит успешно, но при просмотре сертификатов этого файла выдается ошибка:
Can't open certificate store: '/tmp/tmp.G8cd13vzfZ.sig'. Error: No certificate found. /dailybuilds/CSPbuild/CSP/samples/CPCrypt/Certs.cpp:312: 0x2000012D [ErrorCode: 0x2000012d]
Просмотр всех атрибутов сертификата
В cryptcp нет необходимых инструментов для получения всех атрибутов сертификата. Поэтому следует использовать openssl , но настроив его.
certmgr -list -f file.sig | grep 'SHA1 Hash'
В цикле извлекаем сертификаты:
cryptcp -nochain -copycert -thumbprint 255c249150efe3e48f1abb3bc1928fc8f99980c4 -f file.sig -df certificate.der -der
openssl x509 -in certificate.der -inform der -text -noout
openssl_conf = openssl_def # Это в начало файла #Все что ниже в конец [openssl_def] engines = engine_section [engine_section] gost = gost_section [gost_section] engine_id = gost dynamic_path = /usr/lib/ssl/engines/libgost.so # заменить реальным файлом default_algorithms = ALL CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
openssl ciphers | tr ":" "\n" | grep -i gost GOST2001-GOST89-GOST89 GOST94-GOST89-GOST89
Экспорт сертификатов на другую машину
Закрытые ключи к сертификатам находятся тут: /var/opt/cprocsp/keys . Поэтому эти ключи переносятся просто: создаем архив и переносим на нужную машину в тот же каталог.
Экспорт самих сертификатов (если их 14):
for i in `seq 1 14`; do echo $i | certmgr -export -dest $i.cer; done
Переносим эти файлы на машину и смотрим, какие контейнеры есть:
csptest -keyset -enum_cont -verifycontext -fqcn
И как обычно, связываем сертификат и закрытый ключ:
certmgr -inst -file 1.cer -cont '\\.\HDIMAGE\container.name'
Если закрытый ключ и сертификат не подходят друг к другу, будет выведена ошибка:
Can not install certificate Public keys in certificate and container are not identical
Если нет закрытого ключа, то просто ставим сертификат:
Подписание документа ЭЦП
cryptcp -sign (КПС1) -nochain -pin pincode src.txt dest.txt.sig
Пример создания ЭЦП (по SHA1 Hash):
cryptcp -sign -thumbprint 255c249150efe3e48f1abb3bc1928fc8f99980c4 -nochain -pin test test.txt test.txt.sig
[ReturnCode: x] | Описание | Возвращаемый код завершения в баше $? |
---|---|---|
0 | успешно | 0 |
0x8010006b | Введен неправильный PIN | 107 |
0x2000012d | Сертификат не найден | 45 |
0x20000065 | Не удалось открыть файл | 101 |
Проверка подписи ЭЦП
Для верифицирования сертификатов нужен сертификат удостоверяющего центра и актуальный список отзыва сертификатов, либо настроенный для этого revocation provider.
Корневой сертификат УЦ, список отзыва сертификата является одним из реквизитов самого сертификата.
Контрагенты когда открывают подписи в КриптоАРМ используют revocation provider, он делает проверки отзыва сертификата онлайн. Как реализована проверка в Шарепоинте не знаю. Знаю только что используется библиотека Крипто.Net
Проверка конкретной подписи из локального хранилища по его хешу:
cryptcp -verify -thumbprint 255c249150efe3e48f1abb3bc1928fc8f99980c4 -nochain test.txt.sig
Проверить, взяв сертификат из file1.sig , подпись файла file2.sig . Практически, надо использовать один и тот же файл:
cryptcp -verify -norev -f file1.sig file2.sig
Certificates found: 2 Certificate chains are checked. Folder './': file.xls.sig. Signature verifying. Signer: Старший инженер, Иванов Иван Иванович, Отдел закупок, ООО «Верес», Москва, RU, info@site.ru Signature's verified. Signer: Генеральный директор, Сидоров Иван Петрович, Руководство, ООО «Кемоптика», Москва, RU, info@site.ru Signature's verified. [ReturnCode: 0]
[ReturnCode: x] | Текст | Описание | Возвращаемый код завершения в баше $? |
---|---|---|---|
0 | Успешно | 0 | |
0x80091004 | Invalid cryptographic message type | Неправильный формат файла | 4 |
0x80091010 | The streamed cryptographic message is not ready to return data | Пустой файл | 16 |
Получение исходного файла
Получение исходного файла (сообщения):
cryptcp -verify -nochain file.sig file.txt
Будет ругаться на сертификат (так как не будет проверки), но подпись удалит. Вариант с проверкой:
cryptcp -verify -nochain -f file.sig file.sig file.txt
Настройка службы точного времени
apt-get install ntp ntpdate
Необходимо добавить сервера:
# You do need to talk to an NTP server or two (or three). #server ntp.your-provider.example server ntp1.stratum2.ru server ntp2.stratum2.ru