设为首页 收藏本站
查看: 659|回复: 0

[经验分享] 使用 python/ruby 创建 ssl 服务端程序

[复制链接]

尚未签到

发表于 2015-12-15 12:37:03 | 显示全部楼层 |阅读模式
1. 创建一个自签名的 SSL 证书



  • #### 使用 OpenSSL 创建自签名证书



  • ## 1.创建根证书的私钥
  • openssl genrsa -out ca.key 1024

  • ## 2.使用私钥创建根证书
  • openssl req -new -x509 -days 36500 -key ca.key  -out ca.crt -subj "/C=CN/ST=Fujian/L=Xiamen/O=Your Company Name/OU=Your Root CA"

  • ## 3.创建服务器私钥
  • openssl genrsa -out server.key 1024

  • ## 4.使用服务器私钥创建证书请求文件
  • openssl req -new -key server.key  -out server.csr -subj "/C=CN/ST=Fujian/L=Xiamen/O=Your Company Name/OU=youwebsite.org/CN=yourwebsite.org"

  • ## 5.准备工作
  • mkdir -p demoCA/newcerts
  • touch demoCA/index.txt
  • echo '01' > demoCA/serial

  • ## 6.创建服务器证书并使用ca根证书签名
  • openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key


  • ## ---查看不同格式文件的内容命令语法
  • # openssl rsa  -noout -text -in ca.key
  • # openssl x509 -noout -text -in ca.crt
  • # openssl rsa  -noout -text -in server.key
  • # openssl req  -noout -text -in server.csr
  • # openssl x509 -noout -text -in server.crt

  • ## 创建证书最简单方式
  • # openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.key

2. python server



  • import socket, ssl

  • import time

  • cacrtf="ca/ca.crt"
  • crtf="ca/server.crt"
  • keyf="ca/server.key"

  • server_sc = socket.socket()
  • server_sc.bind(('', 10023))
  • server_sc.listen(5)

  • newsocket, addr = server_sc.accept()
  • sc = ssl.wrap_socket(newsocket,
  •                      server_side=True,
  •                      certfile=crtf,
  •                      keyfile=keyf,
  •                      ca_certs=cacrtf)

  • data = sc.read()
  • print data
  • sc.write('Back time: ' + str(time.time()))

  • sc.close()
  • server_sc.close()

3. python client



  • import socket, ssl, pprint

  • import time

  • cacrtf="ca/ca.crt"
  • crtf="ca/server.crt"
  • keyf="ca/server.key"

  • socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  • ssl_socket = ssl.wrap_socket(socket, ca_certs=cacrtf, cert_reqs=ssl.CERT_REQUIRED)
  • ssl_socket.connect(('127.0.0.1', 10023))

  • print repr(ssl_socket.getpeername())
  • print ssl_socket.cipher()
  • print pprint.pformat(ssl_socket.getpeercert())

  • ssl_socket.write("Time: %s\r\n" % time.time())

  • data = ssl_socket.read()
  • print data

  • ssl_socket.close()

4. ruby server



  • require 'socket'

  • require 'openssl'

  • $cacrtf="ca/ca.crt"
  • $crtf="ca/server.crt"
  • $keyf="ca/server.key"

  • server = TCPServer.new('127.0.0.1', 10024)
  • ctx = OpenSSL::SSL::SSLContext.new()
  • ctx.cert= OpenSSL::X509::Certificate.new(File.open($crtf))
  • ctx.key = OpenSSL::PKey::RSA.new(File.open($keyf))
  • ssl_server = OpenSSL::SSL::SSLServer.new(server, ctx)

  • sc = ssl_server.accept

  • p sc.gets
  • sc.puts "Back Time: #{Time.now}"

  • sc.close
  • ssl_server.close

5. ruby client



  • require 'socket'

  • require 'openssl'

  • $cacrtf="ca/ca.crt"
  • $crtf="ca/server.crt"
  • $keyf="ca/server.key"

  • socket = TCPSocket.new('127.0.0.1', 10024)
  • context = OpenSSL::SSL::SSLContext.new
  • context.cert= OpenSSL::X509::Certificate.new(File.open($cacrtf)) # $cacrtf or $crtf
  • ssl_socket = OpenSSL::SSL::SSLSocket.new(socket, context)
  • ssl_socket.sync_close = true
  • ssl_socket.connect
  • p ssl_socket.ssl_version

  • ssl_socket.puts "Time: #{Time.now}"
  • p ssl_socket.gets

  • ssl_socket.close


end.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151523-1-1.html 上篇帖子: 利用python脚本连接mongodb遇到的问题 下篇帖子: Python解密字符串的实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表