
Я пытаюсь создать CA и промежуточный CA для использования в целях подписи/шифрования Office 365 в Outlook. Я смог следовать нескольким руководствам и с помощью OpenSSL создать CA и промежуточный CA, которые генерируют сертификаты. Я сталкиваюсь с двумя проблемами:
- Когда я генерирую сертификат конечного пользователя x509, он помечается как недействительный, поскольку промежуточный центр сертификации не имеет полномочий выдавать сертификаты.
- Если вместо этого я сгенерирую сертификат конечного пользователя с помощью корневого центра сертификации, я смогу нормально подписывать и шифровать электронные письма, но через некоторое время это перестанет работать.
Я думаю, проблема 2 вызвана тем, что сертификаты конечного пользователя не подписаны промежуточным CA. В Exchange Online SMIMEExpiredCertificateThumbprint возвращает отпечаток промежуточного сертификата, а не корневого CA. Я все еще могу опубликовать сертификат конечного пользователя, сгенерированный корневым CA, в GAL и отправить несколько быстрых писем, но как только Outlook синхронизируется с GAL, он видит, что сертификат не был сгенерирован из промежуточного сертификата, и объявляет его неавторизованным.
Я думаю, что решение проблемы 1 решит проблему 2, но я не знаю, как установить разрешения для промежуточного CA на выдачу сертификатов. Есть ли помощь?
Вот как я сейчас создаю корневой и промежуточный ЦС:
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 1826 -key ca.key -out ca.crt
openssl genrsa -out ia.key 4096
openssl req -new -key ia.key -out ia.csr
openssl x509 -req -days 730 -in ia.csr -CA ca.crt -CAkey ca.key -serial -out ia.crt
А вот как генерируются клиенты:
openssl genrsa -aes128 -out email.key 2048
openssl req -new -key email.key -out email.csr
openssl x509 -req -days 365 -in email.csr -CA ia.crt -CAkey ia.key -CAcreateserial -out email.crt
openssl pkcs12 -export -in email.crt -inkey email.key -out email.pfx
openssl x509 -in email.crt -serial -noout >> email.meta
openssl x509 -in email.crt -fingerprint -noout >> email.meta
решение1
Так что, по сути, я не совсем понял, как решить проблему с OpenSSL, но обнаружил, что GnuTLS предлагает использовать сертификат таким образом, что с этим легко работать.
Я генерирую корневой CA следующим образом:
certtool --generate-privkey --bits 4096 --outfile ca.key
certtool --generate-self-signed --load-privkey ca.key --template ca.vars --outfile ca.crt
Вот как выглядит мой ca.vars:
organization = [Company Name]
unit = [Org Unit]
locality = [City]
state = [State]
country = [Country Code]
challenge_password = [password]
password = [password]
expiration_days = 1825
serial = 1
ca
cert_signing_key
crl_signing_key
cn = '[Company Name] Root CA 000001'
ПРИМЕЧАНИЕ: Пароль указан в файле ca.vars, что небезопасно; но для моей реализации скрипт генерирует файл vars, а затем удаляет его с помощью инструмента удаления srm. Если вы не используете скрипты для генерации файлов vars, просто пропустите строки password и challenge_password, и вам будет предложено.
Затем промежуточные CA выглядят следующим образом:
certtool --generate-privkey --bits 4096 --outfile ia.key
certtool --generate-request --template ia.vars --load-privkey ia.key --outfile ia.csr
certtool --generate-certificate --template ia.vars --load-request ia.csr --load-ca-certificate ca.crt --load-ca-privkey ca.key --outfile ia.crt
Разница между ca.vars и ia.vars в том, что я устанавливаю срок действия 365 дней и добавляю следующую строку:
path_len = 1
Оттуда я могу использовать приведенный выше скрипт с openssl и центрами сертификации ia_[sign/encrypt] для генерации сертификатов x509, которые я могу использовать в Outlook с Office 365 для подписи/шифрования писем. Я вставлю его еще раз просто для справки:
openssl genrsa -aes128 -out email.key 2048
openssl req -new -key email.key -out email.csr
openssl x509 -req -days 365 -in email.csr -CA ia.crt -CAkey ia.key -CAcreateserial -out email.crt
openssl pkcs12 -export -in email.crt -inkey email.key -out email.pfx
openssl x509 -in email.crt -serial -noout >> email.meta
openssl x509 -in email.crt -fingerprint -noout >> email.meta
Надеюсь, это поможет кому-то еще, кроме меня! :)