Je l'ai fait dans le but de renvoyer de mauvais en-têtes HTTP, grammaticalement NG HTML ou grammaticalement NG JavaScript à l'autre partie lors de la vérification du fonctionnement du client HTTPS.
L'environnement est le suivant.
Je vais le faire en utilisant openssl.
Si je voulais juste le SSL, la méthode est décrite ci-dessous (je l'ai utilisée comme référence. Merci)
https://qiita.com/masakielastic/items/05cd6a36bb6fb10fccf6
https://stackoverflow.com/a/41366949/531320
Par exemple, si vous souhaitez nommer la clé mock.key et le certificat mock.crt: Le domaine est super adapté (car je ne l'utilise pas ...)
openssl req -x509 -newkey rsa:4096 -sha256 -nodes -keyout mock.key -out mock.crt -subj "/CN=test.com" -days 3650
Avec cela, si vous écrivez Python plus tard, vous pouvez SSL.
Je l'ai écrit en me basant sur le code de l'article suivant (je l'ai utilisé comme référence. Merci)
https://qiita.com/butada/items/9450e39d8d4aac6ac1fe
La documentation officielle est ci-dessous.
https://docs.python.org/3/library/ssl.html
Et c'est le code que j'ai écrit.
#!/usr/bin/env python
# coding: utf-8
import socket
import ssl
import sys
'''
N'hésitez pas à nous contacter en fonction de l'environnement.
'''
TEST_IP = '10.0.0.12'
TEST_PORT = 443
TEST_KEY = "mock.key"
TEST_CERT = "mock.crt"
class TestSSLServer:
'''
J'ai essayé de résumer approximativement le système d'exploitation de base du serveur SSL
'''
def init_soccket(self, key, cert, ip, port):
self.ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
self.ssl_context.load_cert_chain(certfile=cert, keyfile=key)
self.bind_socket = socket.socket()
self.bind_socket.setsockopt(
socket.SOL_SOCKET,
socket.SO_REUSEADDR,
1)
self.bind_socket.setsockopt(
socket.SOL_SOCKET,
socket.SO_REUSEPORT,
1)
self.bind_socket.bind((ip, port))
self.bind_socket.listen(5) #Approprié
def finsih_socket(self):
self.connection_stream.shutdown(socket.SHUT_RDWR)
self.connection_stream.close()
def accept_socket(self):
while True:
try:
self.accept_socket, _fromaddr = self.bind_socket.accept()
self.connection_stream = self.ssl_context.wrap_socket(
self.accept_socket, server_side=True)
return
except ssl.SSLError:
'''
Chrome,Firefox donne cette erreur
Retourner pour accepter en vue de la connexion
'''
print("wrap: SSL error:", sys.exc_info()[0])
continue
except OSError:
'''
Le système Safari donne cette erreur
Retourner pour accepter en vue de la connexion
'''
print("wrap: OS error:", sys.exc_info()[0])
continue
except BaseException:
'''
Je ne sais rien d'autre, donc je suppose que le processus ne s'est pas terminé w (CTRL-C devrait venir ici)
'''
print(
"wrap: Unexpected error:",
sys.exc_info()[0])
sys.exit(1)
def read_stream(self):
bin_data = self.connection_stream.read()
return bin_data
def write_stream(self, bin_data):
self.connection_stream.sendall(bin_data)
if __name__ == '__main__':
'''
Initialisation
'''
server = TestSSLServer()
server.init_soccket(TEST_KEY, TEST_CERT, TEST_IP, TEST_PORT)
'''
Attente de la connexion
'''
server.accept_socket()
'''
Demande et réponse une fois
'''
bin_data = server.read_stream()
if bin_data:
print (bin_data)
content = "<html>test</html>"
text = "HTTP/1.1 200 OK\r\n"
text += "Content-Length: " + str(len(content)) + "\r\n\r\n"
text += content
server.write_stream(text.encode())
'''
Déconnecter, libérer des ressources
'''
server.finsih_socket()
Le code original était Python2, mais j'essaie de le faire fonctionner avec 3. De plus, SO_REUSEADDR est défini en tenant compte du cas où il est arrêté au milieu.
Plus tard, le comportement au moment de l'erreur est modifié de sorte qu'il est OK même s'il est accédé à partir du navigateur. Plus précisément, si l'authentification échoue à cause de moi, ssl.SSLError ou OSError sera affiché, donc dans ce cas, recommencez simplement à partir d'accepter w
Comme vous pouvez le voir dans le code, vous devez écrire vous-même tous les en-têtes et tous les corps. En d'autres termes, vous pouvez consulter vos données préférées sans vous soucier de la grammaire.
Quant à la méthode d'exécution, lors de l'utilisation du port 443, il était nécessaire de sudo sur Ubuntu. Quelque chose comme ça.
sudo python3.7 sample_server.py
Le reste vient du navigateur
https://xxx.xxxx.xxxx.xxx:nnnn
Vous devez juste y accéder comme ça. Si TEST_PORT est défini sur 443,: nnnn n'est pas nécessaire. Je suis sûr que vous serez grondé pour le certificat, mais si vous le connaissez et le faites dans le flux de la connexion, vous devriez passer un test.
Recommended Posts