[Erlang]如何在Erlang中使用SSL

原创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface

最近准备写一个SSL服务器,结果发现网上相关的资料很少,因为特地在此给大家分享一下SSL的基本使用方法.

SSL在使用上跟Tcp很像,但是也由区别。首先需要一个SSL证书,可以在参考这篇文章创建。

下面的代码实现了服务端和客户端,对于有经验erlang同学,应该很容易理解了,就不赘述了。

服务器端

  1. -module(s).
  2. -export([start/0, client/1, accept/1]).
  3. start() ->
  4. ssl:start(),
  5. server(4000).
  6. server(Port) ->
  7. {ok, LSocket} = ssl:listen(Port, [{certfile,"certificate.pem"}, {keyfile, "key.pem"}, {reuseaddr, true}, {active, false}]),
  8. spawn(fun() -> accept(LSocket) end).
  9. accept(LSocket) ->
  10. {ok, Socket} = ssl:transport_accept(LSocket),
  11. Pid = spawn(fun() ->
  12. io:format("Connection accepted ~p~n", [Socket]),
  13. loop(Socket)
  14. end),
  15. ssl:controlling_process(Socket, Pid),
  16. accept(LSocket).
  17. loop(Socket) ->
  18. ssl:setopts(Socket, [{active, once}]),
  19. receive
  20. {ssl,Sock, Data} ->
  21. io:format("Got packet: ~p~n", [Data]),
  22. ssl:send(Sock, Data),
  23. loop(Socket);
  24. {ssl_closed, Sock} ->
  25. io:format("Closing socket: ~p~n", [Sock]);
  26. Error ->
  27. io:format("Error on socket: ~p~n", [Error])
  28. end.

客户端:

  1. client(N) ->
  2. {ok, Socket} = ssl:connect("localhost", 4000,  []),
  3. io:format("Client opened socket: ~p~n",[Socket]),
  4. ok = ssl:send(Socket, N),
  5. Value = receive
  6. {ssl,{sslsocket,new_ssl,_}, Data} ->
  7. io:format("Client received: ~p~n",[Data])
  8. after 2000 ->
  9. 0
  10. end,
  11. ssl:close(Socket),
  12. Value.
  1. $ erl
  2. Eshell V5.8.5  (abort with ^G)
  3. 1> c(s).
  4. {ok,s}
  5. 2> s:start().
  6. <0.52.0>
  7. Connection accepted {sslsocket,new_ssl,<0.54.0>}
  8. Got packet: "Hello"
  9. Closing socket: {sslsocket,new_ssl,<0.54.0>}

别忘了在客户端进程启动ssl服务

  1. $ erl
  2. Eshell V5.8.5  (abort with ^G)
  3. 1> ssl:start().
  4. ok
  5. 2> s:client("Hello").
  6. Client opened socket: {sslsocket,new_ssl,<0.49.0>}
  7. Client received: "Hello"
  8. ok

因为是SSL,所以需要安全验证:

1.option中得 verify设置,验证peer(对端)的合法性

  • 0 - 不验证
  • 1 -  验证
  • 2 - 验证,同时peer如果没有证书,验证失败

2.depth验证,此选项指定了允许验证几个证书,允许值0-N

  • 0 - 只验证peer证书
  • 1 -  验证CA证书
  • 2 - 验证多本CA证书
时间: 2024-11-09 04:50:41

[Erlang]如何在Erlang中使用SSL的相关文章

[Erlang]如何在Erlang中将对list进行json编码?

Json编码,在python里就是一句话: json.dumps(user_data) 但是Erlang没有自带的Json模块,只能自己造轮子: 先下载mochijson2: https://github.com/mochi/mochiweb/blob/master/src/mochijson2.erl 用erlc编译 然后,上代码: get_json_data() -> UserData = [{"product_name", "Programming Erlang&

如何在tsung中使用动态参数(一)

这两天给公司一个新项目做上线前的压力测试,这个项目主要的接口有两个,获取订单号(getOrderId)和确认订单(confirm),需要重点压测.开始,我们选择用python写测试例,python的好处是开发迅速,但是并发能力不够:我就想试试用tsung,tsung是用erlang写的,并发肯定没问题,但我以前只用来测试过静态网站,没有测试过动态API,查了查文档,发现tsung是支持用erlang脚本生成动态参数的,于是我决定用tsung. tsung的安装略过,看一下getorderId的配

如何在Ruby中编写微服务?

[编者按]本文作者为 Pierpaolo Frasa,文章通过详细的案例,介绍了在Ruby中编写微服务时所需注意的方方面面.系国内 ITOM 管理平台 OneAPM 编译呈现. 最近,大家都认为应当采用微服务架构.但是,又有多少相关教程呢?我们来看看这篇关于用Ruby编写微服务的文章吧. 人人都在讨论微服务,但我至今也没见过几篇有关用Ruby编写微服务的.像样的教程.这可能是因为许多Ruby开发人员仍然最喜欢Rails架构(这没什么不好,Rails本身也没什么不好,但是Ruby可以做到的事还有很

[Erlang]通用的erlang优化设置

设置是我在多个项目中通用的,不过根据应用场景的不同,还会有其它细调,就不在这一一说明了.  - Sunface  一. erl启动时参数: +K true 开启epoll调度,在linux中开启epoll,会大大增加调度的效率 +A 100 异步线程池,为某些port调用服务 +P 1024000 最大进程数 +Q 65535 最大port数 +sbt db 绑定调度器,绑定后调度器的任务队列不会在各个CPU线程之间跃迁,结合sub使用,可以让CPU负载均衡的同时也避免了大量的跃迁发生. 注意:

Erlang基础 -- 介绍 -- Erlang特点

前言 Erlang是具有多重范型的编程语言,具有很多特点,主要的特点有以下几个: 函数式 并发性 分布式 健壮性 软实时 热更新 递增式代码加载 动态类型 解释型 函数式 Erlang是函数式编程语言,函数式是一种编程模型,将计算机中的运算看做是数学中的函数计算,可以避免状态以及变量的概念. 对象是面向对象的第一型,函数式编程语言也是一样,函数是函数式编程的第一型.函数是Erlang编程语言的基本单位,在Erlang里,函数是第一型,函数几乎会被用作一切,包括最简单的计算.所有的概念都是由函数表

Archive for the ‘Erlang’ Category 《Erlang编程指南》读后感

http://timyang.net/category/erlang/ 在云时代,我们需要有更好的能利用多核功能及分布式能力的编程语言,Erlang在这方面具有天生的优势,因此我们始终对它保持强烈关注. 按:此为客座文章,投稿人为新浪微博基础研发工程师赵鹏城(http://weibo.com/iamzpc),以下为原文.在对一个分布式KV存储系统的研究过程中,我有幸遇到了Erlang语言.因此,我研究工作的第一目标就是快速入门Erlang语言并在实际研究过程中进一步深入理解Erlang的精髓.在

如何在makfile中查看变量的值

在makefile中查看变量的取值是多少应该是一个比较麻烦的问题,但是本大神自己研究出一个十分方便的方法.这个方法十分简单.现在介绍如下 如果在一个十分复杂庞大的makefile文件中,有个地方用到一个变量SRC_FILE,你很想知道makefile运行到此处的时候这个变量的值为多少.那么你可以在这个变量的下面写两行东东: $(shell echo $(SRC_FILE) > readme.txt ) rrrrrrrrrrrrrrrrrrr 第一行其实是调用shell命令来将这个变量的值输入到r

如何在Angular2-cli中使用插件(不使用配置)

重要点: 要把插件放在src/assets文件中 如何在angular-cli中使用jquery插件 a.在index.html中引入 <script  src="./assets/jquery-1.8.3.min.js"></script> b. 在要使用jquery的组件中声明(XX.component.ts) declare var $ : any; c.导入onInit import { OnInit} from '@angular/core'; d.输

Excel技巧|如何在Excel中快速的批量将unix时间戳转化为北京时间

本文标签:  Excel技巧 unix时间戳转化北京时间 Excel时间戳转化北京时间 互联网杂谈 批量将将unix时间戳转化为北京时间 方法/步骤 单击要获得北京时间的那一列,右键,选择[设置单元格格式],在弹出的窗口中,左侧选择 [日期],右侧选择你想要的时间格式,点击确定. 选中其中一个单元格,输入公式 =(A2+8*3600)/86400+70*365+19 其中,A2是要转化的时间戳的单元格. 输入完公式,按下[回车键]. 该时间戳即转化为北京时间. 选中上面转化好的北京时间单元格,鼠