Как я могу криптографически подтвердить, что кто-то владеет веб-сайтом, на который он претендует?
В частности, могу ли я заставить их подписать текстовую строку своим личным сертификатом x509, а затем я могу подтвердить это с помощью общедоступного сертификата, используемого на соответствующем веб-сайте? Возможно, я мог бы предоставить им неподписанный сертификат для подписи или что-то на этот счет.
Заранее спасибо:)
3 ответа
Да, как вы и предлагали, вы могли бы отправить им строку байтов (в этом контексте мы могли бы назвать это текстом запроса), чтобы они зашифровали его с помощью закрытого ключа SSL/TLS своего сервера и отправили обратно зашифрованный текст, а затем вы можете проверить его расшифровав его с помощью открытого ключа из сертификата сервера SSL/TLS.
Или вы можете сгенерировать строку байтов, зашифровать ее с помощью открытого ключа из своего сертификата сервера, отправить его им, сделать так, чтобы они расшифровали его с помощью закрытого ключа своего сервера, и попросили вернуть вам исходный открытый текст.
Обратите внимание, что относительно немногие люди знают, как делать такие вещи с помощью своего закрытого ключа SSL, поэтому не удивляйтесь, если вам придется предоставить им пошаговые инструкции для поиска их закрытого ключа и шифрования или расшифровки вашего вызов.
Вы можете попросить их отправить вам электронное письмо с этого домена или сделать whois (CLI или использовать https://www.whois.net/) и посмотреть, есть ли их контакт в списке, или вы можете попросить их загрузить страницу подтверждения на свой сайт. url / yeaIownthis.html с каким-то паролем или чем-то еще.
Вот метод, использующий M2Crypto и python:
f = open(CERT_FILE)
cert_buffer = f.read()
f.close()
from M2Crypto import RSA, X509
cert = X509.load_cert_string(cert_<wbr>buffer, X509.FORMAT_PEM)
pub_key = cert.get_pubkey()
rsa_key = pub_key.get_rsa()
cipher = rsa_key.public_encrypt('<wbr>plaintext', RSA.pkcs1_padding)
print cipher
ReadRSA = RSA.load_key(KEY_FILE)
try:
plaintext = ReadRSA.private_decrypt (cipher, RSA.pkcs1_padding)
except:
print "Error: wrong key?"
plaintext = ""
print plaintext
Выдержка взята из этой статьи.