一行命令使用 python3 搭 https 服务

发布时间 2023-04-24 20:34:25作者: Nestar

很多时候 python 搭个私有 http 服务会很方便,很常规的应用,比如传个文件啥的。有时候某些场景下要求必需是 https 服务。怎么搭呢。

原理部分

正常的搭建 https 服务过程如下:
1、 安装 openssl
2、生成证书密钥对

# 直接默认生成
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
# openssl req -newkey rsa:2048 -new -nodes -keyout key.pem -out csr.pem
# 直接默认生成
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
# openssl req -newkey rsa:2048 -new -nodes -keyout key.pem -out csr.pem

3、启动服务
```python
import http.server, ssl

server_address = ('0.0.0.0', 4443)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,
                               server_side=True,
                               certfile='cert.pem',
                               keyfile="key.pem",
                               ssl_version=ssl.PROTOCOL_TLSv1)
httpd.serve_forever()

但是这样好麻烦哦,我想一行命令启动

一行命令启动(低版本)

尝试使用一行命令开启

echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURhekNDQWxPZ0F3SUJBZ0lVV3BmZXhnRGFtYUlIY3krMzZWMDI0UTdoTzJVd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1JURUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeElUQWZCZ05WQkFvTQpHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpEQWVGdzB5TXpBME1qUXdPVFF3TkRaYUZ3MHpNekEwCk1qRXdPVFF3TkRaYU1FVXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJREFwVGIyMWxMVk4wWVhSbE1TRXcKSHdZRFZRUUtEQmhKYm5SbGNtNWxkQ0JYYVdSbmFYUnpJRkIwZVNCTWRHUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzIwaTcvSy8yekhwaCtmbkIweU5kanVDaGEwd3l5cVR4RlU3NGFyamNGClZJMXh0ZU9KZkthQjU0OTJLVC9lc2gvek5SQUVHbU1BcE5aMXAwZVQwN3BTak9wMHpjaWxoZFgwYUxWbkRIVW4KbmEwYzVVVHFiblM3LzhiVldKRHV5QUtMa0Y0bDUyQlVqZ3lXeDJVY1VSS1dONEFRZlNFUDdHR1hNUnk3bTEySgpBNm81dHZxaytqZzhVTXgvZVZwMlY5NW1NWHRhYU56TUVyay9XdXhrOWk5UFlLOXlnUTVqVVhhRjlibEpuVXFrCmdTRTlLNUM3SFVXUllKcGcvMTZPUU5QYjFoVU5TT1llN2tNWUtscjlvYytFUEtGaWxrT21janhvbmlHanBkNm4KUHFIbHdJWm82UDR1RExnaHNnc2NwTkozeFpNSDJSWTFHTkNxZ2Uxc3V0Q2JBZ01CQUFHalV6QlJNQjBHQTFVZApEZ1FXQkJTNFMxYTNubUdmMmNmSDY3NCtHaFh6Qnc1c2N6QWZCZ05WSFNNRUdEQVdnQlM0UzFhM25tR2YyY2ZICjY3NCtHaFh6Qnc1c2N6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQisKYXlMR1ptSEhqeitCRnMzY2RvWEt6bEZZa0IxRFBhNitYZE1CcUFzRXpzUXdYUmtFSTc1RTYxYmxnSUZnWG5QYQpuNUZMT3ZTWkR1RUpFN093SG5YdzNFZ3B6RFlRYkIrTXRGUyt3dkVYeGJTdktBZGpCYS9vSnRzeVEvNUhuTmN6CnZWZTNtQU1oYTlscmdMMXlxaktWOUJtcVM4bnY3ZndPRXBzVXhObzZwOUp1Mmt0YnBRQ045NlV6L2ZJYWJabXcKc1U1NXkxaU4yR0hVdWV2SDFNR1JGaUxDUzNpQjc2VUhtUEFSN2JEa2Jzc2R3M3RwRzhWYkxNamZUL1ljYnljeQo4ZGo2MDBRM3VFcFNIbUNMSG83U1l4c3diU2dES3pxcDNSSTdDL3VFSXQva3FsSm1qalNGQnV4cTYrNDQ0VitvCjAxamZ0SzdGS290VE1tNXM1eXJ6Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K" | base64 -d > cert.pem && echo "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2d0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktrd2dnU2xBZ0VBQW9JQkFRQzIwaTcvSy8yekhwaCsKZm5CMHlOZGp1Q2hhMHd5eXFUeEZVNzRhcmpjRlZJMXh0ZU9KZkthQjU0OTJLVC9lc2gvek5SQUVHbU1BcE5aMQpwMGVUMDdwU2pPcDB6Y2lsaGRYMGFMVm5ESFVubmEwYzVVVHFiblM3LzhiVldKRHV5QUtMa0Y0bDUyQlVqZ3lXCngyVWNVUktXTjRBUWZTRVA3R0dYTVJ5N20xMkpBNm81dHZxaytqZzhVTXgvZVZwMlY5NW1NWHRhYU56TUVyay8KV3V4azlpOVBZSzl5Z1E1alVYYUY5YmxKblVxa2dTRTlLNUM3SFVXUllKcGcvMTZPUU5QYjFoVU5TT1llN2tNWQpLbHI5b2MrRVBLRmlsa09tY2p4b25pR2pwZDZuUHFIbHdJWm82UDR1RExnaHNnc2NwTkozeFpNSDJSWTFHTkNxCmdlMXN1dENiQWdNQkFBRUNnZ0VBRFRvUXIySjU1T3NxUWtDWWwwSnVudWJVZUptN1dmTzNpaGFBY3dLMnRWcUUKTHoxbkhHdlp5aDA4T21MS25heUtkamlaRTRyckxjRS9TTnpVNTJPU24rVlZFeVZPUm5kejNzNXlqV1dQMWxGbwpsR1ljQWRBQy94VUd5Q216dHFyZTBFVWVJcVRtU2NmTExsOTN0OEEvMVlGbmNRbjBpZWZpdWFNU2ZwcERmcVdYCmFEVEpnbHlaTVB4bmF3ZUpJYkNnSTRTblBlTUgyR09LTXlUZk5RbkhMeTBkV1JtWXA1N3QrYnBtWUJucGFYMVgKTzhoQ3ZKL2YwVjV6TE1OVGhGR25tVm8rcHJpVExZb0FPUkJpZzRjeWd0aEJIbG5WanU1aEpkSzNSWHNUdG1rYgpjZUttWDJBaDJ3dUZkMk96Y1dQWWxoMU12bndUVWJrMVYvdkhLVjE0K1FLQmdRRFFVSUZqOXB6YnJubEZ3blhtCkJwS0ZvVnBURFo1emRsOTU1TXFZcGU0VThRQkVBdXdUdGlRYVVpcDZzTjBiaEZWTGxvdStxazlzZnJ1ajdVYmkKZDBvL3Zqc0xnaTdISnlnSmJrdWFpMUZScFVlWlVuN0RTc1JTblQ1dEc5Z3pZNElhQ2l6WVpSblJ0TjNtTG9mVApsMGdLK28rbTRxZmowZGg2MVhWSEE3WWFhUUtCZ1FEZ3E3ck05aDBIS1lWVVpSNDUwUnA1THRZeTAzd0E1SkZJCk9iVEhnaThuV3lYa1NLOG11TUQzb29selViV25zWlZTVmxibmVycW9PWG9KaHNlUGFTZmdpajZoZ1A1U0pVQ2MKQ0VTbi9qK2s3bkEyK2NUWWRTcW44T2U3TnZ5TTBHdXZ1eEdubHFwZHV4enIzdHJwb2kyZWZCd21NcGQrZU8xbQpvK0k3WkVLS1l3S0JnUUMzR2h3eFJvSm5vanRjY3VuNGoweFpBeE9HcnhEWWduSzNqTC83WHRZZk9CcTRyU3plCndwbUhQVE96ZGlSVFhJVXdsSm91dERwdHJoTzJxZ2hGWlA4eGVqOGlCWUtpY0t1RFpwd3pza04vRlYwU3ltMDcKc1V0UkpuL0puZER5a29PMzZidXpWV0pWYnJvZzZrTmZXN2pxVllUUTlxY0YyOXlCVTREck03cnNDUUtCZ1FDbQoyU0hxNE1PQjlDWGVIUklyWWN6RlBqRTRvYkl2ZjQ4ZEVpM2RGQ01zbVJZMHlIMjZ4ZTRZZVk2V0k1SkNMVEYxCmFrVXp0d016dHl1WU00MjBSU1dtTFVTQjhDZnVuVmUwQ0xma0FuOEZYMFhhcmZhdndhT2lBTmczUW9pZmtwREcKZXFpTHl1cE9uWXpHNWtPd3lnNFM2cHlGQ1lGVUhUNUF3V2hiTHdQemZRS0JnUUNzKzNRSjJwVGhBcGxOeWppRAo3clBFcGgxd2EybkxzZjF1MHhlT3NJdVZWVWNtUC9raW15dXBkZ0txWEh6MVVGemt5ZkM5bUV1Y0wrYVFWdldwCkhSb0llWG1zSHhQVm1yNWxvY3Zsd2pJaWdqQVN1cVlOUGxiMU1HRHBKNlNsT0tST0d2K1NLYms5T2ZOU2pqYUMKdElvRTdWN0Q2TW5lb3JxV3pmb0ZjNHI1a1E9PQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==" | base64 -d > key.pem && echo "aW1wb3J0IGh0dHAuc2VydmVyLCBzc2wKCnNlcnZlcl9hZGRyZXNzID0gKCcwLjAuMC4wJywgNDQ0MykKaHR0cGQgPSBodHRwLnNlcnZlci5IVFRQU2VydmVyKHNlcnZlcl9hZGRyZXNzLCBodHRwLnNlcnZlci5TaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIpCmh0dHBkLnNvY2tldCA9IHNzbC53cmFwX3NvY2tldChodHRwZC5zb2NrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfc2lkZT1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9J2NlcnQucGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWZpbGU9ImtleS5wZW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxKQpodHRwZC5zZXJ2ZV9mb3JldmVyKCk=" | base64 -d > ssss.py && python ssss.py

结果测试的时候发现,这种有的时候可以有的时候不行,提示:

/home/parallels/ssss.py:5: DeprecationWarning: ssl.wrap_socket() is deprecated, use SSLContext.wrap_socket()

这个时候访问的话,会提示使用的协议浏览器不支持

高版本

那就使用 SSLContext.wrap_socket() 开启一个试试, 其中 执行的 python 代码如下:

import http.server
import ssl
from http.server import HTTPServer, SimpleHTTPRequestHandler

class MyHandler(SimpleHTTPRequestHandler):
  def do_GET(self):
    try:
      # 用 SimpleHTTPRequestHandler 处理请求
      return SimpleHTTPRequestHandler.do_GET(self)
    except FileNotFoundError:
      # 如果请求的文件不存在,返回 404 错误
      self.send_error(404, 'File Not Found: %s' % self.path)

httpd = HTTPServer(('0.0.0.0', 443), MyHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,
                               keyfile='key.pem',
                               certfile='cert.pem',
                               server_side=True)
httpd.serve_forever()

高版本一句话(直接复制,然后命令行执行即可):

echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURhekNDQWxPZ0F3SUJBZ0lVV3BmZXhnRGFtYUlIY3krMzZWMDI0UTdoTzJVd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1JURUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdNQ2xOdmJXVXRVM1JoZEdVeElUQWZCZ05WQkFvTQpHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpEQWVGdzB5TXpBME1qUXdPVFF3TkRaYUZ3MHpNekEwCk1qRXdPVFF3TkRaYU1FVXhDekFKQmdOVkJBWVRBa0ZWTVJNd0VRWURWUVFJREFwVGIyMWxMVk4wWVhSbE1TRXcKSHdZRFZRUUtEQmhKYm5SbGNtNWxkQ0JYYVdSbmFYUnpJRkIwZVNCTWRHUXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzIwaTcvSy8yekhwaCtmbkIweU5kanVDaGEwd3l5cVR4RlU3NGFyamNGClZJMXh0ZU9KZkthQjU0OTJLVC9lc2gvek5SQUVHbU1BcE5aMXAwZVQwN3BTak9wMHpjaWxoZFgwYUxWbkRIVW4KbmEwYzVVVHFiblM3LzhiVldKRHV5QUtMa0Y0bDUyQlVqZ3lXeDJVY1VSS1dONEFRZlNFUDdHR1hNUnk3bTEySgpBNm81dHZxaytqZzhVTXgvZVZwMlY5NW1NWHRhYU56TUVyay9XdXhrOWk5UFlLOXlnUTVqVVhhRjlibEpuVXFrCmdTRTlLNUM3SFVXUllKcGcvMTZPUU5QYjFoVU5TT1llN2tNWUtscjlvYytFUEtGaWxrT21janhvbmlHanBkNm4KUHFIbHdJWm82UDR1RExnaHNnc2NwTkozeFpNSDJSWTFHTkNxZ2Uxc3V0Q2JBZ01CQUFHalV6QlJNQjBHQTFVZApEZ1FXQkJTNFMxYTNubUdmMmNmSDY3NCtHaFh6Qnc1c2N6QWZCZ05WSFNNRUdEQVdnQlM0UzFhM25tR2YyY2ZICjY3NCtHaFh6Qnc1c2N6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQisKYXlMR1ptSEhqeitCRnMzY2RvWEt6bEZZa0IxRFBhNitYZE1CcUFzRXpzUXdYUmtFSTc1RTYxYmxnSUZnWG5QYQpuNUZMT3ZTWkR1RUpFN093SG5YdzNFZ3B6RFlRYkIrTXRGUyt3dkVYeGJTdktBZGpCYS9vSnRzeVEvNUhuTmN6CnZWZTNtQU1oYTlscmdMMXlxaktWOUJtcVM4bnY3ZndPRXBzVXhObzZwOUp1Mmt0YnBRQ045NlV6L2ZJYWJabXcKc1U1NXkxaU4yR0hVdWV2SDFNR1JGaUxDUzNpQjc2VUhtUEFSN2JEa2Jzc2R3M3RwRzhWYkxNamZUL1ljYnljeQo4ZGo2MDBRM3VFcFNIbUNMSG83U1l4c3diU2dES3pxcDNSSTdDL3VFSXQva3FsSm1qalNGQnV4cTYrNDQ0VitvCjAxamZ0SzdGS290VE1tNXM1eXJ6Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K" | base64 -d > cert.pem && echo "LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2d0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktrd2dnU2xBZ0VBQW9JQkFRQzIwaTcvSy8yekhwaCsKZm5CMHlOZGp1Q2hhMHd5eXFUeEZVNzRhcmpjRlZJMXh0ZU9KZkthQjU0OTJLVC9lc2gvek5SQUVHbU1BcE5aMQpwMGVUMDdwU2pPcDB6Y2lsaGRYMGFMVm5ESFVubmEwYzVVVHFiblM3LzhiVldKRHV5QUtMa0Y0bDUyQlVqZ3lXCngyVWNVUktXTjRBUWZTRVA3R0dYTVJ5N20xMkpBNm81dHZxaytqZzhVTXgvZVZwMlY5NW1NWHRhYU56TUVyay8KV3V4azlpOVBZSzl5Z1E1alVYYUY5YmxKblVxa2dTRTlLNUM3SFVXUllKcGcvMTZPUU5QYjFoVU5TT1llN2tNWQpLbHI5b2MrRVBLRmlsa09tY2p4b25pR2pwZDZuUHFIbHdJWm82UDR1RExnaHNnc2NwTkozeFpNSDJSWTFHTkNxCmdlMXN1dENiQWdNQkFBRUNnZ0VBRFRvUXIySjU1T3NxUWtDWWwwSnVudWJVZUptN1dmTzNpaGFBY3dLMnRWcUUKTHoxbkhHdlp5aDA4T21MS25heUtkamlaRTRyckxjRS9TTnpVNTJPU24rVlZFeVZPUm5kejNzNXlqV1dQMWxGbwpsR1ljQWRBQy94VUd5Q216dHFyZTBFVWVJcVRtU2NmTExsOTN0OEEvMVlGbmNRbjBpZWZpdWFNU2ZwcERmcVdYCmFEVEpnbHlaTVB4bmF3ZUpJYkNnSTRTblBlTUgyR09LTXlUZk5RbkhMeTBkV1JtWXA1N3QrYnBtWUJucGFYMVgKTzhoQ3ZKL2YwVjV6TE1OVGhGR25tVm8rcHJpVExZb0FPUkJpZzRjeWd0aEJIbG5WanU1aEpkSzNSWHNUdG1rYgpjZUttWDJBaDJ3dUZkMk96Y1dQWWxoMU12bndUVWJrMVYvdkhLVjE0K1FLQmdRRFFVSUZqOXB6YnJubEZ3blhtCkJwS0ZvVnBURFo1emRsOTU1TXFZcGU0VThRQkVBdXdUdGlRYVVpcDZzTjBiaEZWTGxvdStxazlzZnJ1ajdVYmkKZDBvL3Zqc0xnaTdISnlnSmJrdWFpMUZScFVlWlVuN0RTc1JTblQ1dEc5Z3pZNElhQ2l6WVpSblJ0TjNtTG9mVApsMGdLK28rbTRxZmowZGg2MVhWSEE3WWFhUUtCZ1FEZ3E3ck05aDBIS1lWVVpSNDUwUnA1THRZeTAzd0E1SkZJCk9iVEhnaThuV3lYa1NLOG11TUQzb29selViV25zWlZTVmxibmVycW9PWG9KaHNlUGFTZmdpajZoZ1A1U0pVQ2MKQ0VTbi9qK2s3bkEyK2NUWWRTcW44T2U3TnZ5TTBHdXZ1eEdubHFwZHV4enIzdHJwb2kyZWZCd21NcGQrZU8xbQpvK0k3WkVLS1l3S0JnUUMzR2h3eFJvSm5vanRjY3VuNGoweFpBeE9HcnhEWWduSzNqTC83WHRZZk9CcTRyU3plCndwbUhQVE96ZGlSVFhJVXdsSm91dERwdHJoTzJxZ2hGWlA4eGVqOGlCWUtpY0t1RFpwd3pza04vRlYwU3ltMDcKc1V0UkpuL0puZER5a29PMzZidXpWV0pWYnJvZzZrTmZXN2pxVllUUTlxY0YyOXlCVTREck03cnNDUUtCZ1FDbQoyU0hxNE1PQjlDWGVIUklyWWN6RlBqRTRvYkl2ZjQ4ZEVpM2RGQ01zbVJZMHlIMjZ4ZTRZZVk2V0k1SkNMVEYxCmFrVXp0d016dHl1WU00MjBSU1dtTFVTQjhDZnVuVmUwQ0xma0FuOEZYMFhhcmZhdndhT2lBTmczUW9pZmtwREcKZXFpTHl1cE9uWXpHNWtPd3lnNFM2cHlGQ1lGVUhUNUF3V2hiTHdQemZRS0JnUUNzKzNRSjJwVGhBcGxOeWppRAo3clBFcGgxd2EybkxzZjF1MHhlT3NJdVZWVWNtUC9raW15dXBkZ0txWEh6MVVGemt5ZkM5bUV1Y0wrYVFWdldwCkhSb0llWG1zSHhQVm1yNWxvY3Zsd2pJaWdqQVN1cVlOUGxiMU1HRHBKNlNsT0tST0d2K1NLYms5T2ZOU2pqYUMKdElvRTdWN0Q2TW5lb3JxV3pmb0ZjNHI1a1E9PQotLS0tLUVORCBQUklWQVRFIEtFWS0tLS0tCg==" | base64 -d > key.pem && echo "aW1wb3J0IGh0dHAuc2VydmVyCmltcG9ydCBzc2wKZnJvbSBodHRwLnNlcnZlciBpbXBvcnQgSFRUUFNlcnZlciwgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyCgpjbGFzcyBNeUhhbmRsZXIoU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyKToKICBkZWYgZG9fR0VUKHNlbGYpOgogICAgdHJ5OgogICAgICAjIOeUqCBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIg5aSE55CG6K+35rGCCiAgICAgIHJldHVybiBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIuZG9fR0VUKHNlbGYpCiAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CiAgICAgICMg5aaC5p6c6K+35rGC55qE5paH5Lu25LiN5a2Y5Zyo77yM6L+U5ZueIDQwNCDplJnor68KICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwNCwgJ0ZpbGUgTm90IEZvdW5kOiAlcycgJSBzZWxmLnBhdGgpCgpodHRwZCA9IEhUVFBTZXJ2ZXIoKCcwLjAuMC4wJywgNDQzKSwgTXlIYW5kbGVyKQpodHRwZC5zb2NrZXQgPSBzc2wud3JhcF9zb2NrZXQoaHR0cGQuc29ja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZmlsZT0na2V5LnBlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ZmlsZT0nY2VydC5wZW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3NpZGU9VHJ1ZSkKaHR0cGQuc2VydmVfZm9yZXZlcigp" | base64 -d > ssss.py && python ssss.py

image

直接复制回车就行
image

可惜中文会乱码,如果你的 python 是显示使用 python3 ,那么命令最后哪里改成 python3 就行