Re: Using the SSL module.
Trilok Tourani <[email protected]>
| Newsgroups | gmane.comp.lang.pike.user |
|---|---|
| Message-ID | <CA+9+xUYi8sQsUgED2pg+JK_yopmnMcYpBKh82qTsXY=VnbtNYA@mail.gmail.com> |
The code that you have written in your previous mail, starts listening for
the ports, but when I connect a sock to 127.0.0.1:1234, it doesn't seem to
be calling the accept or http_query functions. It just hangs there.
(sock->connect("127.0.0.1",1234);)
Regards
Trilok Tourani
On Mon, Jun 22, 2015 at 8:17 PM, Chris Angelico <[email protected]> wrote:
> On Mon, Jun 22, 2015 at 4:34 PM, Trilok Tourani
> <[email protected]> wrote:
> > Thanks Chris. Any example would be great.
>
> Okay. Got around to dusting off some old code and making sure it
> actually, yaknow, works. This is written for Pike 8.1, so you may need
> to make some changes for 7.8.
> void http_query(Protocols.HTTP.Server.Request r)
> {
> write("Request for %s\n",r->not_query);
> r->response_and_finish((["data":"You requested:
> "+r->not_query,"type":"text/plain"]));
> }
>
> void sockread(object sock,string data)
> {
> write("[%d] Data received: %O\n",hash_value(sock),data);
> if (String.trim_all_whites(data)=="quit") {sock->write("Bye!\n");
> sock->close();}
> else sock->write("Uh huh.\n");
> }
>
> void sockgone(object sock)
> {
> write("[%d] Disconnected.\n",hash_value(sock));
> }
>
> object mainsock;
> void accept(object sock)
> {
> mainsock->accept(); //Will return sock, same as the argument.
> Dunno why we get it both ways.
> write("[%d] New connection from
> %s\n",hash_value(sock),sock->query_address());
> sock->set_read_callback(sockread);
> sock->set_close_callback(sockgone);
> sock->set_id(sock);
> sock->write("Hello, world!\n");
> }
>
> int main()
> {
> //Load up three files...
> //1) Certificate chain from the CSA
> sscanf(Stdio.read_file("gd_bundle.crt"),"%{%*s-----BEGIN
> CERTIFICATE-----%s-----END CERTIFICATE-----%}",array certs);
> certs=MIME.decode_base64(certs[*][0][*]);
> //2) Our certificate
> sscanf(Stdio.read_file("demo.crt"),"%*s-----BEGIN
> CERTIFICATE-----%s-----END CERTIFICATE-----",string crt);
> certs=({MIME.decode_base64(crt)})+certs; //Ours first, chain following
> it
> //3) Our private key
> sscanf(Stdio.read_file("demo.key"),"%*s-----BEGIN RSA PRIVATE
> KEY-----%s-----END RSA PRIVATE KEY-----",string key);
> key=MIME.decode_base64(key);
> write("Keys loaded successfully.\n");
>
> Protocols.HTTP.Server.SSLPort(http_query,443,"::",key,certs);
>
> object ctx=SSL.Context();
> ctx->add_cert(Standards.PKCS.RSA.parse_private_key(key),certs,({"*"}));
> mainsock=SSL.Port(ctx); mainsock->bind(1234,accept,"::");
> write("Listening on ports 443 and 1234.\n");
> return -1;
> }
>
>
>
> This is a dual server - HTTPS and a TLS-enabled telnet-like
> connection. For this, I used a certificate that I bought from GoDaddy,
> so the authority chain comes from the GoDaddy certificate bundle
> (gd_bundle.crt). Using a self-signed cert would also work, and as
> Grubba pointed out, Pike is quite capable of generating those.
>
> It's pretty simple, and might even be simpler than I've shown here.
> Note the one liner to set up HTTPS hosting... a simple reactive
> function to handle requests, and you can completely ignore SSL and
> just work with the requests themselves.
>
> ChrisA
>
>