+ All Categories
Home > Documents > SSL + PTHREADS (spanish)

SSL + PTHREADS (spanish)

Date post: 16-Nov-2014
Category:
Upload: koitoer
View: 396 times
Download: 1 times
Share this document with a friend
Description:
Try to describe how to make a ssl connection between a server and client, create the ssl certificates, have code with examples and a zip with material. All this with C programming language.www.koitoer.com
52
Programaci´on con Sockets Secure Layer y Pthreads Ing. Mauricio Mena Cort´ es koitoer 28 de abril de 2009 1
Transcript
Page 1: SSL + PTHREADS (spanish)

Programacion con Sockets Secure Layer yPthreads

Ing. Mauricio Mena Corteskoitoer

28 de abril de 2009

1

Page 2: SSL + PTHREADS (spanish)

Indice general

1. Prefacio 51.1. A quien lo lea: . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2. Instalacion basica 72.1. Requerimientos del sistema . . . . . . . . . . . . . . . . . . . 72.2. Openssl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3. Creacion de certificados 93.1. Explicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.2. CA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93.3. Certificado del servidor . . . . . . . . . . . . . . . . . . . . . 123.4. Certificado del cliente . . . . . . . . . . . . . . . . . . . . . . 17

4. Codigos Fuentes 234.1. SERVER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234.2. CLIENTE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294.3. Compilacion . . . . . . . . . . . . . . . . . . . . . . . . . . . 344.4. MAKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

5. Servidor Multihilo 395.1. SERVER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

6. Conclusion 486.1. Problemas principales . . . . . . . . . . . . . . . . . . . . . . 48

6.1.1. Creacion de certificados . . . . . . . . . . . . . . . . . 486.1.2. Firewall . . . . . . . . . . . . . . . . . . . . . . . . . . 49

6.2. Tutoriales futuros . . . . . . . . . . . . . . . . . . . . . . . . 516.3. Ideas Finales . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

2

Page 3: SSL + PTHREADS (spanish)

INDICE GENERAL 3

6.4. Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . 52

Page 4: SSL + PTHREADS (spanish)

Indice de figuras

4.1. Inicio de ejecucion del servidor ssl . . . . . . . . . . . . . . . 354.2. Conexion con socket ssl . . . . . . . . . . . . . . . . . . . . . . 364.3. Conexion con sockets sin ssl . . . . . . . . . . . . . . . . . . . 38

5.1. Inicio de ejecucion de multihilo ssl (Comandos) . . . . . . . . 465.2. Inicio de ejecucion de multihilo ssl (Corriendo) . . . . . . . . . 47

6.1. Iptables desbloqueando puerto . . . . . . . . . . . . . . . . . . 506.2. Iptables bloqueando puerto . . . . . . . . . . . . . . . . . . . 51

4

Page 5: SSL + PTHREADS (spanish)

Parte 1

Prefacio

1.1. A quien lo lea:

Este tutorial pretende ser informativo y guıa de aquellas personas quese adentran al mundo de la programacion en red utilizando el lenguaje C.Si bien es cierto que los lenguajes orientados a objetos son mas faciles dedominar y aprender, en un ambiente de servidores y cargas de trabajo muyelevadas el lenguaje C sigue siendo de los mas usados e importantes ya queconsidera y da una vision mas detallada de los procesos que se ejecutan enlos servidores y de la red al tener que definirlos desde el protocolo a usar

Cabe mencionar que toda la documentacion de las funciones, las estruc-turas y lıbrerias se encuentran en muchas paginas de internet, ademas deencontrarse en el man de cualquier sistema linux o unix, con los posiblesparametros o definiciones de estructuras, por lo que solo dare unos links in-teresantes al final del manual, y no me pondre a explicar cada estructurani funciones del sistema. Con esto no pretendo decir que no explicare nada,si no que estructuras como sockaddin y demas estan documentadas muchomejor en internet.

En lo personal he leido muchos tutoriales, donde dicen que tienen losarhivos fuente listos para descarga y que lo ejecutes con un shell y la verdadmuchos no han funcionado, por lo que tratare de realmente plasmar codigoque funcione. Todo esto para llegar a un fin, el cual sera realizar un servidorque pueda atender a varios clientes simultaneamente, ademas de la creaciondel cliente que se conectara con el mismo. La funcionalidad del servidor queprogramare es solo el envıo de mensajes, por lo que la implementacion de un

5

Page 6: SSL + PTHREADS (spanish)

PARTE 1. PREFACIO 6

uso especıfico sera responsabilidad del programador.Tampoco pretendo explicar teorıas de los hilos en C usando pthread, ni

la teorıa del cifrado que se usa con un opensource llamado openssl, ya queconsidero en la red hay mucha informacion al respecto y sale de los objetivosde este tutorial.

Bueno esperando el tutorial sea claro, conciso y les sirva en este mundodel Socket Programming empecemos.

Page 7: SSL + PTHREADS (spanish)

Parte 2

Instalacion basica

2.1. Requerimientos del sistema

Primero que nada todo este manual esta orientado a sistemas linux - unix,por lo que cabe mencionar que no funcionara en windows, aunque en esenciaes el mismo procedimiento, las librerıas ocupadas son diferentes (winsock),por lo que se tendran que aplicar cambios para el funciomaniento de losprogramas en entornos de Windows.

La distribucion que se use no tendra por que importar, ya que en realidadlo que se necesitara es tener instalado

1. GCC

2. GDB

3. OpenSSL

La instalacion de Gcc es recomendable que se haga desde que se instalael sistema linux. O con instaladores con repositorios tipo (yum,apt,etc ...).Con respecto al GDB es el depurador de GNU, su uso es a base de unaejecucion del programa y una serie de comandos de ayudan al trace del propioprograma en ejecucion, se recomienda su uso para la depuracion, aunque paraeste tutorial no sera indispensable

7

Page 8: SSL + PTHREADS (spanish)

PARTE 2. INSTALACION BASICA 8

2.2. Openssl

Con respecto al openssl su instalacion solo consta de los siguientes pasos.

1. Crear el directorio# mkdir /usr/src/

2. Bajar de http://www.openssl.org/source/ la version estable de openssl,que viene en tar.gz# wget http://www.openssl.org/source/openssl-0.9.8k.tar.gz

3. Descomprimir# tar zxvf http://www.openssl.org/source/openssl-0.9.8k.tar.gz

4. Compilamos

# cd openssl-0.9.8k

# ./config

# make

# make test

# make install

Quedando instalado en /usr/local/ssl

Comprobamos la lista de ciphers /usr/local/ssl/bin/openssl ciphers -v’ALL:!ADH:@STRENGTH’

Si hay un problema en la instalacion, que por lo general no ocurre en lapagina de openssl hay documentacion al respecto de la instalacion, aunquerealmente es un proceso sencillo, y dependiendo de la capacidad de la maquinasera el tiempo que dure este proceso de instalacion.

Mediante el uso de esta instruccionopenssl speed Podemos saber el tiempo de procesamiento del openssl ennuestra maquina para los diferentes ciphers existentes.

Page 9: SSL + PTHREADS (spanish)

Parte 3

Creacion de certificados

3.1. Explicaciones

Ahora bien una vez instalado, OpenSSL nos servira para crear los certifi-cados que se necesitan, ademas de darnos la API, para trabajar con Socketsde manera segura.

Para la creacion de los certificados, en este caso necesitaremos tres, unoque actue como autoridad certificadora, uno que sea el del servidor y porultimo el que se usara en el cliente.

client.pem Certificado del cliente. client.key Llave privada del cliente. cac-ert.pem Certificado de Autoridad Certificadora. server.key Llave privada delservidor. server.pem Certificado del servidor.

Para generarlos usaremos openssl, generando primero el de la autoridadcertificadora, para que firme digitalmente el del servidor y del cliente, esto dela siguiente manera.

En este caso se crea primero la autoridad certificadora que seremos nos-tros mismos, despues de eso tendremos que hacer las peticiones para creardos nuevos certificados y por ultimo firmarlos por medio de la autoridadcertificadora creada anteriormente.

3.2. CA

root@koitoersv:/home/koitoer# pwd

/home/koitoer

root@koitoersv:/home/koitoer# mkdir certs

9

Page 10: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 10

root@koitoersv:/home/koitoer# cd certs/

root@koitoersv:/home/koitoer/certs# cp /usr/lib/ssl/misc/CA.sh

root@koitoersv:/home/koitoer/certs# cp /usr/lib/ssl/misc/CA.sh .

root@koitoersv:/home/koitoer/certs# ./CA.sh -newca

CA certificate filename (or enter to create)

Making CA certificate ...

Generating a 1024 bit RSA private key

................................................++++++

........++++++

writing new private key to ’./demoCA/private/./cakey.pem’

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

Verify failure

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter ’.’, the field will be left blank.

-----

Country Name (2 letter code) [MX]:

State or Province Name (full name) [Distrito Federal]:

Locality Name (eg, city) []:KoitoerCity

Organization Name (eg, company) []:Koitoercompany

Organizational Unit Name (eg, section) []:KoitoerOrg

Common Name (eg, YOUR name) []:KoitoerCorp.

Email Address []:[email protected]

Please enter the following ’extra’ attributes

to be sent with your certificate request

A challenge password []:koitoerCA

An optional company name []:koitoerCAcorp

Using configuration from /usr/lib/ssl/openssl.cnf

Enter pass phrase for ./demoCA/private/./cakey.pem:

Page 11: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 11

Check that the request matches the signature

Signature ok

Certificate Details:

Serial Number: 0 (0x0)

Validity

Not Before: Apr 23 14:17:14 2009 GMT

Not After : Apr 22 14:17:14 2012 GMT

Subject:

countryName = MX

stateOrProvinceName = Distrito Federal

organizationName = Koitoercompany

organizationalUnitName = KoitoerOrg

commonName = KoitoerCorp.

emailAddress = [email protected]

X509v3 extensions:

X509v3 Subject Key Identifier:

EC:2A:55:C2:8C:1E:A9:CD:0E:DA:AA:8F:84:34:74:54:54

:A6:46:2A

X509v3 Authority Key Identifier:

keyid:EC:2A:55:C2:8C:1E:A9:CD:0E:DA:AA:8F:84:34:74

:54:54:A6:46:2A

DirName:/C=MX/ST=Distrito Federal/

O=Koitoercompany/OU=KoitoerOrg/

CN=KoitoerCorp./[email protected]

serial:00

X509v3 Basic Constraints:

CA:TRUE

Certificate is to be certified until Apr 22 14:17:14 2012 GMT (1095 days)

Write out database with 1 new entries

Data Base Updated

Con esto habremos creado el certificado autorizador que se guardara endemoCA con el nombre de cacert.pem, que actuara como nuestra autoridadcertificadora, ademas de crear un archivo cakey.pem que es la llave priva-

Page 12: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 12

da de la autoridad certificadora creada, la cual deberemos de guardar muycelosamente, ya que si alguien tiene acceso a esta llave y al certificado puedefirmar certificados, como si hubiesen sido emitidos por nosotros.

Ahora toca el turno de generar el certificado del servidor.

3.3. Certificado del servidor

root@koitoersv:/home/koitoer/certs# pwd

/home/koitoer/certs

root@koitoersv:/home/koitoer/certs# mkdir server_cert

root@koitoersv:/home/koitoer/certs# ls

CA.sh demoCA server_cert

root@koitoersv:/home/koitoer/certs# ./CA.sh -newreq

Generating a 1024 bit RSA private key

................++++++

...........................................................++++++

writing new private key to ’newkey.pem’

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

-----

You are about to be asked to enter information that

will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished

Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter ’.’, the field will be left blank.

-----

Country Name (2 letter code) [MX]:

State or Province Name (full name) [Distrito Federal]:

Locality Name (eg, city) []:Koitoerserverland

Organization Name (eg, company) [Telecomunicaciones de Mexico]:koitoerserver

Organizational Unit Name (eg, section) []:koitoerservers

Common Name (eg, YOUR name) []:koitoer.server

Email Address []:[email protected]

Page 13: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 13

Please enter the following ’extra’ attributes

to be sent with your certificate request

A challenge password []:koitoer.server

An optional company name []:koitoersslserver

Request is in newreq.pem, private key is in newkey.pem

root@koitoersv:/home/koitoer/certs# ls

CA.sh demoCA newkey.pem newreq.pem server_cert

root@koitoersv:/home/koitoer/certs# ./CA.sh -sign

Using configuration from /usr/lib/ssl/openssl.cnf

Enter pass phrase for ./demoCA/private/cakey.pem:

Check that the request matches the signature

Signature ok

Certificate Details:

Serial Number: 1 (0x1)

Validity

Not Before: Apr 23 14:27:08 2009 GMT

Not After : Apr 23 14:27:08 2011 GMT

Subject:

countryName = MX

stateOrProvinceName = Distrito Federal

localityName = Koitoerserverland

organizationName = koitoerserver

organizationalUnitName = koitoerservers

commonName = koitoer.server

emailAddress = [email protected]

X509v3 extensions:

X509v3 Basic Constraints:

CA:FALSE

Netscape Comment:

OpenSSL Generated Certificate

X509v3 Subject Key Identifier:

61:4A:1E:46:8A:EA:19:39:AE:C2:5D:05:3F:2A:68

:EA:E6:69:AD:80

X509v3 Authority Key Identifier:

keyid:EC:2A:55:C2:8C:1E:A9:CD:0E:DA:AA:8F:84

:34:74:54:54:A6:46:2A

Page 14: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 14

Certificate is to be certified until Apr 23 14:27:08 2011 GMT (730 days)

Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated

Certificate:

Data:

Version: 3 (0x2)

Serial Number: 1 (0x1)

Signature Algorithm: sha1WithRSAEncryption

Issuer: C=MX, ST=Distrito Federal, O=Koitoercompany,

OU=KoitoerOrg,

CN=KoitoerCorp./[email protected]

Validity

Not Before: Apr 23 14:27:08 2009 GMT

Not After : Apr 23 14:27:08 2011 GMT

Subject: C=MX, ST=Distrito Federal, L=Koitoerserverland,

O=koitoerserver, OU=koitoerservers,

CN=koitoer.server/[email protected]

Subject Public Key Info:

Public Key Algorithm: rsaEncryption

RSA Public Key: (1024 bit)

Modulus (1024 bit):

00:bb:f3:50:d8:39:32:5b:75:37:72:47:ac:e0:62:

a0:98:60:50:bc:02:3e:ec:5f:69:d5:8a:d0:54:b4:

f8:dc:f4:46:6b:4b:5b:ac:55:e7:85:f3:cf:9b:5b:

45:66:5a:7c:15:ae:e5:f6:15:11:ab:9b:51:58:1a:

f9:8f:b6:b6:14:3f:05:49:1c:a6:1d:14:67:d0:e9:

5e:e3:da:bb:26:b5:3c:0f:d6:fd:62:67:21:4c:1a:

58:cb:6f:d7:5c:a5:06:e4:cf:c4:4b:02:a2:59:d5:

d5:bf:c7:f2:1e:7a:09:22:ad:80:1b:ee:90:0a:c8:

9c:38:89:18:7f:09:65:36:c7

Exponent: 65537 (0x10001)

X509v3 extensions:

X509v3 Basic Constraints:

CA:FALSE

Page 15: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 15

Netscape Comment:

OpenSSL Generated Certificate

X509v3 Subject Key Identifier:

61:4A:1E:46:8A:EA:19:39:AE:C2:5D:05:3F:2A:68:

E6:69:AD:80

X509v3 Authority Key Identifier:

keyid:EC:2A:55:C2:8C:1E:A9:CD:0E:DA:AA:8F:84:

34:74:54:54:A6:46:2A

Signature Algorithm: sha1WithRSAEncryption

17:b0:78:8f:0b:21:58:c8:72:f3:de:fc:fe:11:34:e9:34:4c:

6d:48:fd:03:74:1b:e7:3c:c2:50:41:0f:14:32:9a:be:ad:e3:

9a:28:92:fe:10:63:33:5e:c2:7a:d7:b1:0e:87:ba:af:06:4e:

c3:65:cd:91:5f:c8:36:27:66:b5:6b:ee:f8:5e:86:42:71:d5:

1c:27:57:ff:3f:42:f4:96:28:54:d6:1f:b7:6f:2c:15:f9:ce:

ce:04:53:ec:f5:98:b1:6d:2d:cc:ab:42:44:e2:93:47:c0:b9:

90:13:15:11:50:ef:23:05:fd:fb:a2:f5:8c:3d:cb:a1:fd:c9:

27:c3

-----BEGIN CERTIFICATE-----

MIIDQTCCAqqgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMCTVgx

GTAXBgNVBAgTEERpc3RyaXRvIEZlZGVyYWwxFzAVBgNVBAoTDktvaXRvZXJjb21w

YW55MRMwEQYDVQQLEwpLb2l0b2VyT3JnMRUwEwYDVQQDEwxLb2l0b2VyQ29ycC4x

KDAmBgkqhkiG9w0BCQEWGWtvaXRvZXIuY29tcGFueUBnbWFpbC5jb20wHhcNMDkw

NDIzMTQyNzA4WhcNMTEwNDIzMTQyNzA4WjCBtzELMAkGA1UEBhMCTVgxGTAXBgNV

BAgTEERpc3RyaXRvIEZlZGVyYWwxGjAYBgNVBAcTEUtvaXRvZXJzZXJ2ZXJsYW5k

MRYwFAYDVQQKEw1rb2l0b2Vyc2VydmVyMRcwFQYDVQQLEw5rb2l0b2Vyc2VydmVy

czEXMBUGA1UEAxMOa29pdG9lci5zZXJ2ZXIxJzAlBgkqhkiG9w0BCQEWGGtvaXRv

ZXIuc2VydmVyQGdtYWlsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA

u/NQ2DkyW3U3ckes4GKgmGBQvAI+7F9p1YrQVLT43PRGa0tbrFXnhfPPm1tFZlp8

Fa7l9hURq5tRWBr5j7a2FD8FSRymHRRn0Ole49q7JrU8D9b9YmchTBpYy2/XXKUG

5M/ESwKiWdXVv8fyHnoJIq2AG+6QCsicOIkYfwllNscCAwEAAaN7MHkwCQYDVR0T

BAIwADAsBglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNh

dGUwHQYDVR0OBBYEFGFKHkaK6hk5rsJdBT8qaOrmaa2AMB8GA1UdIwQYMBaAFOwq

VcKMHqnNDtqqj4Q0dFRUpkYqMA0GCSqGSIb3DQEBBQUAA4GBABeweI8LIVjIcvPe

/P4RNOk0TG1I/QN0G+c8wlBBDxQymr6t45ookv4QYzNewnrXsQ6Huq8GTsNlzZFf

yDYnZrVr7vhehkJx1RwnV/8/QvSWKFTWH7dvLBX5zs4EU+z1mLFtLcyrQkTik0fA

uZATFRFQ7yMF/fui9Yw9y6H9ySfD

-----END CERTIFICATE-----

Page 16: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 16

Signed certificate is in newcert.pem

root@koitoersv:/home/koitoer/certs# ls

CA.sh demoCA newcert.pem newkey.pem newreq.pem server_cert

root@koitoersv:/home/koitoer/certs# cp newcert.pem server_cert/server.pem

root@koitoersv:/home/koitoer/certs# cp newkey.pem server_cert/server.key

root@koitoersv:/home/koitoer/certs# cp new* server_cert/

root@koitoersv:/home/koitoer/certs# ls

CA.sh demoCA newcert.pem newkey.pem newreq.pem server_cert

root@koitoersv:/home/koitoer/certs# rm new*

root@koitoersv:/home/koitoer/certs# ls

CA.sh demoCA server_cert

root@koitoersv:/home/koitoer/certs# cd server_cert/

root@koitoersv:/home/koitoer/certs/server_cert# ls

newcert.pem newkey.pem newreq.pem server.key server.pem

root@koitoersv:/home/koitoer/certs/server_cert#

Aclaro que cuando preguntawriting new private key to ’newkey.pem’ Enter PEM pass phrase:La clave que pongamos sera la de este certificado que se esta creando.

y cuando marcaEnter pass phrase for ./demoCA/private/cakey.pem:Tenemos que introducir la passphrase de la autoridad certificadora, es decir,el passphrase que le pusimos a cakey.pem, con lo que aseguramos que nosotrossomos los duenos del CA y firmamos el nuevo certificado generado.

Estas passphrase son de suma importancia y deben ser frase muy fuertes,ya que en buena forma estos certificados depende de la fortaleza del passphrase.Ya que con un ataque de fuerza bruta por diccionario se pueden clonar cer-tificados previamente emitidos.

Ahora el certificado que creamos, es decir el del servidor, siempre que lousemos requerira la intervencion humana para colocar la passphrase (esto severa mas a detalle), por lo que ahora al crear el certificado del cliente haremosunos cambios para evitar tener que introducir la passphrase cada que se hagauso del certificado.

Puede ser de gran ayuda dejar el certificado del servidor con la interven-cion humana al colocar la passphrase, ya que es el proveera el servicio y puedeque no queramos que cualquier persona pueda levantar o quitar el servicio.

Page 17: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 17

3.4. Certificado del cliente

Para el caso del cliente se realizaran las siguientes configuraciones.Crearemos ahora el certificado del cliente, con las siguientes modifica-

ciones en el archivo/usr/lib/ssl/misc/CA.sh

Lınea 5656 REQ− new − x509− keyoutnewkey.pem− outnewcert.pemDAYSCambiamos por :56 REQ−new−nodes−x509−keyoutnewkey.pem−outnewcert.pemDAYS

Tambien lınea 6262 REQ− new − keyoutnewkey.pem− outnewreq.pemDAYSCambiamos por :62 REQ− new − nodes− keyoutnewkey.pem− outnewreq.pemDAYS

Guardamos los cambios y generamos el certificado del cliente.

root@koitoersv:/home/koitoer/certs# vim /usr/lib/ssl/misc/CA.sh

root@koitoersv:/home/koitoer/certs# ls

CA.sh demoCA server_cert

root@koitoersv:/home/koitoer/certs# /usr/lib/ssl/misc/CA.sh -newreq

Generating a 1024 bit RSA private key

...++++++

....++++++

writing new private key to ’newkey.pem’

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter ’.’, the field will be left blank.

-----

Country Name (2 letter code) [MX]:

State or Province Name (full name) [Distrito Federal]:

Locality Name (eg, city) []:KoitoerClient

Page 18: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 18

Organization Name (eg, company) []:KoitoerCLiente

Organizational Unit Name (eg, section) []:koitoer.sectioncliente

Common Name (eg, YOUR name) []:koitoer.cliente

Email Address []:[email protected]

Please enter the following ’extra’ attributes

to be sent with your certificate request

A challenge password []:koitoer.ssl_cliente

An optional company name []:koitoer_ssl_cliente

Request is in newreq.pem, private key is in newkey.pem

root@koitoersv:/home/koitoer/certs# /usr/lib/ssl/misc/CA.sh -sign

Using configuration from /usr/lib/ssl/openssl.cnf

Enter pass phrase for ./demoCA/private/cakey.pem:

Check that the request matches the signature

Signature ok

Certificate Details:

Serial Number: 2 (0x2)

Validity

Not Before: Apr 23 14:38:50 2009 GMT

Not After : Apr 23 14:38:50 2011 GMT

Subject:

countryName = MX

stateOrProvinceName = Distrito Federal

localityName = KoitoerClient

organizationName = KoitoerCLiente

organizationalUnitName = koitoer.sectioncliente

commonName = koitoer.cliente

emailAddress = [email protected]

X509v3 extensions:

X509v3 Basic Constraints:

CA:FALSE

Netscape Comment:

OpenSSL Generated Certificate

X509v3 Subject Key Identifier:

89:4C:83:EA:4B:54:C2:BB:16:80:A7:96:15:D7:42:11:

82:2E:1C:D6

X509v3 Authority Key Identifier:

keyid:EC:2A:55:C2:8C:1E:A9:CD:0E:DA:AA:8F:84:34:

Page 19: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 19

74:54:54:A6:46:2A

Certificate is to be certified until Apr 23 14:38:50 2011 GMT (730 days)

Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated

Certificate:

Data:

Version: 3 (0x2)

Serial Number: 2 (0x2)

Signature Algorithm: sha1WithRSAEncryption

Issuer: C=MX, ST=Distrito Federal, O=Koitoercompany,

OU=KoitoerOrg, CN=KoitoerCorp./[email protected]

Validity

Not Before: Apr 23 14:38:50 2009 GMT

Not After : Apr 23 14:38:50 2011 GMT

Subject: C=MX, ST=Distrito Federal, L=KoitoerClient,

O=KoitoerCLiente, OU=koitoer.sectioncliente,

CN=koitoer.cliente/[email protected]

Subject Public Key Info:

Public Key Algorithm: rsaEncryption

RSA Public Key: (1024 bit)

Modulus (1024 bit):

00:c3:4b:60:8e:ca:88:53:c0:29:04:6f:b3:14:56:

44:3f:db:aa:48:09:c6:b5:69:0a:e8:8b:6a:17:72:

c2:f8:1a:57:f0:28:26:32:d6:03:55:f5:f4:53:62:

72:c3:27:62:bf:88:a9:26:b8:83:48:30:9a:d1:79:

1f:32:70:ca:74:ce:d6:5f:58:fd:65:70:f2:19:0a:

f2:f4:fd:48:4e:1d:8c:36:9f:6f:0b:3f:37:ab:2d:

68:dc:c9:12:7c:ce:4b:c4:1c:f8:29:44:2e:f2:20:

46:d4:fd:0a:4e:8e:af:87:23:cf:ef:7a:f8:7a:92:

61:27:6e:0b:33:5a:88:e7:2d

Exponent: 65537 (0x10001)

X509v3 extensions:

X509v3 Basic Constraints:

Page 20: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 20

CA:FALSE

Netscape Comment:

OpenSSL Generated Certificate

X509v3 Subject Key Identifier:

89:4C:83:EA:4B:54:C2:BB:16:80:A7:96:15:D7:42

:11:82:2E:1C:D6

X509v3 Authority Key Identifier:

keyid:EC:2A:55:C2:8C:1E:A9:CD:0E:DA:AA:8F:84

:34:74:54:54:A6:46:2A

Signature Algorithm: sha1WithRSAEncryption

50:fa:50:27:ef:23:cd:bf:83:b7:21:92:23:d6:f6:ee:c2:67:

95:fe:c7:ee:7b:56:de:ad:ed:13:f0:27:91:f1:32:41:ba:62:

66:77:1f:ec:05:1b:89:6e:00:f7:c8:e4:fa:25:2a:91:4a:e3:

e7:1f:41:f2:2b:e9:00:ea:a6:43:bf:32:aa:45:53:b7:53:17:

6a:bd:9d:97:45:5e:a3:5a:2f:85:04:ee:41:4b:c4:8d:ab:ec:

1c:84:b7:a1:1a:3d:4f:e3:19:14:ed:27:08:7d:9d:6f:07:c6:

1b:e1:7b:d5:bd:90:93:15:48:fb:82:ad:3d:59:9b:bf:67:c8:

24:f9

-----BEGIN CERTIFICATE-----

MIIDSDCCArGgAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UEBhMCTVgx

GTAXBgNVBAgTEERpc3RyaXRvIEZlZGVyYWwxFzAVBgNVBAoTDktvaXRvZXJjb21w

YW55MRMwEQYDVQQLEwpLb2l0b2VyT3JnMRUwEwYDVQQDEwxLb2l0b2VyQ29ycC4x

KDAmBgkqhkiG9w0BCQEWGWtvaXRvZXIuY29tcGFueUBnbWFpbC5jb20wHhcNMDkw

NDIzMTQzODUwWhcNMTEwNDIzMTQzODUwWjCBvjELMAkGA1UEBhMCTVgxGTAXBgNV

BAgTEERpc3RyaXRvIEZlZGVyYWwxFjAUBgNVBAcTDUtvaXRvZXJDbGllbnQxFzAV

BgNVBAoTDktvaXRvZXJDTGllbnRlMR8wHQYDVQQLExZrb2l0b2VyLnNlY3Rpb25j

bGllbnRlMRgwFgYDVQQDEw9rb2l0b2VyLmNsaWVudGUxKDAmBgkqhkiG9w0BCQEW

GWtvaXRvZXIuY2xpZW50ZUBnbWFpbC5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0A

MIGJAoGBAMNLYI7KiFPAKQRvsxRWRD/bqkgJxrVpCuiLahdywvgaV/AoJjLWA1X1

9FNicsMnYr+IqSa4g0gwmtF5HzJwynTO1l9Y/WVw8hkK8vT9SE4djDafbws/N6st

aNzJEnzOS8Qc+ClELvIgRtT9Ck6Or4cjz+96+HqSYSduCzNaiOctAgMBAAGjezB5

MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENl

cnRpZmljYXRlMB0GA1UdDgQWBBSJTIPqS1TCuxaAp5YV10IRgi4c1jAfBgNVHSME

GDAWgBTsKlXCjB6pzQ7aqo+ENHRUVKZGKjANBgkqhkiG9w0BAQUFAAOBgQBQ+lAn

7yPNv4O3IZIj1vbuwmeV/sfue1bere0T8CeR8TJBumJmdx/sBRuJbgD3yOT6JSqR

SuPnH0HyK+kA6qZDvzKqRVO3UxdqvZ2XRV6jWi+FBO5BS8SNq+wchLehGj1P4xkU

7ScIfZ1vB8Yb4XvVvZCTFUj7gq09WZu/Z8gk+Q==

Page 21: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 21

-----END CERTIFICATE-----

Signed certificate is in newcert.pem

root@koitoersv:/home/koitoer/certs# mkdir

CA.sh demoCA/ newcert.pem newkey.pem newreq.pem server_cert/

root@koitoersv:/home/koitoer/certs# mkdir cliente_cert

root@koitoersv:/home/koitoer/certs# cp newkey.pem cliente.key

root@koitoersv:/home/koitoer/certs# cp newcert.pem cliente.pem

root@koitoersv:/home/koitoer/certs# cp new* cliente

cliente_cert/ cliente.key cliente.pem

root@koitoersv:/home/koitoer/certs# cp new* cliente_cert/

root@koitoersv:/home/koitoer/certs# ls

CA.sh cliente.key demoCA newkey.pem server_cert

cliente_cert cliente.pem newcert.pem newreq.pem

root@koitoersv:/home/koitoer/certs# cp cliente.* cliente

cliente_cert/ cliente.key cliente.pem

root@koitoersv:/home/koitoer/certs# cp cliente.* cliente_cert/

root@koitoersv:/home/koitoer/certs# ls

CA.sh cliente.key demoCA newkey.pem server_cert

cliente_cert cliente.pem newcert.pem newreq.pem

root@koitoersv:/home/koitoer/certs# rm cliente.*

root@koitoersv:/home/koitoer/certs# ls

CA.sh cliente_cert demoCA newcert.pem newkey.pem newreq.pem server_cert

root@koitoersv:/home/koitoer/certs# rm new*

root@koitoersv:/home/koitoer/certs# ls

CA.sh cliente_cert demoCA server_cert

root@koitoersv:/home/koitoer/certs# cd cliente_cert/

root@koitoersv:/home/koitoer/certs/cliente_cert# ls

cliente.key cliente.pem newcert.pem newkey.pem newreq.pem

root@koitoersv:/home/koitoer/certs/cliente_cert#

Con lo que habremos generado el certificado del cliente. Debemos tomaren cuenta que el nuevo certificado se nombre primero newreq.pem y newkey.pem,donde newkey es la llave del certificado, y newreq es el certificado pero sinfirmar, despues de firmar el certificado se genera un newcert.pem que es elcertificado firmado, por lo que como en el caso del cliente y del servidor,renombro los archivos a server.key y server.pem, en el caso del cliente a

Page 22: SSL + PTHREADS (spanish)

PARTE 3. CREACION DE CERTIFICADOS 22

cliente.key y cliente.pem, y nunca renombro newreq.pem, ya que en realidadno tienen ningun valor si no han sido firmados por la CA.

Ahora si tenemos el certificado cacert.pem en

/home/koitoer/certs/demoCA/cacert.pem

La llave y certificado del server en:

/home/koitoer/certs/server_cert/server.key --Llave servidor

/home/koitoer/certs/server_cert/server.pem --Certificado servidor

La llave y certificado del cliente en:

/home/koitoer/certs/cliente_cert/cliente.key --Llave cliente

/home/koitoer/certs/cliente_cert/cliente.pem --Certificado cliente

Alguna cosas que nos pueden ayudar, es la modificacion del openssl.cnf,para generar los nombres default para cada campo del certificado, ademasde poner el tiempo de caducidad de los certificados y otras opciones intere-santes. Asi que recomiendo lean un poco mas acerca de la modificacion delopenssl.cnf.

Bueno una vez que se tienen los certificados, pues es hora de programar.XD

Page 23: SSL + PTHREADS (spanish)

Parte 4

Codigos fuentes del servidor ycliente

Ahora despues de unos minutos de programacion tenemos listo el codigofuente del servidor SSL, veremos que la implementacion consiste en crearciertos contextos que nos permiten darle a un socket normal previamentehecho, la funcionalidad de seguridad que deseamos a traves de la configu-racion del mismo con contexto y mediante la eleccion del cipher de cifrado,que hara uso de certificados de autenticacion.

4.1. SERVER

#include <s t d i o . h>#include <errno . h>#include <uni s td . h>#include <malloc . h>#include <s t r i n g . h>#include <sys / socket . h>

/∗ L ı b r e r i a para l o s s o c k e t ∗/#include <r e s o l v . h>#include <netdb . h>#include <opens s l / s s l . h>

/∗ L ı b r e r i a de o p e n s s l para l a f u n c i o n a l i d a d y c o n t e x t o s ∗/#include <opens s l / e r r . h>

/∗ L ı b r e r i a de o p e n s s l para e r r o r e s ∗/#define FAIL −1

23

Page 24: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 24

/∗−−− CrearSocket −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗Crea un s o c k e t normal para implementar le SSL −−−−−∗/

int CrearSocket ( int port ) {int sd ;struct sockaddr in addr ;sd = socket (PF INET , SOCK STREAM, 0) ;bzero(&addr , s izeof ( addr ) ) ;addr . s i n f am i l y = AF INET ;addr . s i n p o r t = htons ( port ) ;addr . s i n addr . s addr = INADDR ANY;i f ( bind ( sd , ( struct sockaddr ∗)&addr , s izeof ( addr ) ) != 0 ){per ro r ( ”Error a l l i g a r e l socke t ” ) ;abort ( ) ;

}i f ( l i s t e n ( sd , 10) != 0 ) {

per ro r ( ”Error en e l l i s t e n ” ) ;abort ( ) ;

}return sd ;

}

/∗−−− IniciarCTXServidor −−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗ I n i c i a l i z a e l s e r v i d o r y crea e l c o n t e x t o s e r v e r −∗/

SSL CTX∗ In ic iarCTXServidor (void ) {SSL METHOD ∗method ;SSL CTX ∗ ctx ;OpenSSL add al l a lgor i thms ( ) ;/∗ Carga l o s c i p h e r s de c i f r a d o ∗/SSL l o ad e r r o r s t r i n g s ( ) ;/∗ Carga l o s mensajes de e rror de SSL ∗/method = SSLv2 server method ( ) ;/∗ Crea una i n s t a n c i a d e l metodo s e r v i d o r en SSLv2 ∗/ctx = SSL CTX new(method ) ;/∗ Crea e l c o n t e x t o para e l metodo de s e r v i d o r ∗/i f ( ctx == NULL ) {

ERR pr in t e r ro r s fp ( s t d e r r ) ;abort ( ) ;

}/∗ Se e l i g e l a s u i t e que se desea usar , en e s t e caso ”DES−

CBC3−SHA”∗/i f ( SSL CTX set c iphe r l i s t ( ctx , ”DES−CBC3−MD5” ) == 1) {

p r i n t f ( ” S i se pudo e s t a b l e c e r \n” ) ;

Page 25: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 25

} else {p r i n t f ( ”No se pudo e s t a b l e c e r \n” ) ;

}return ctx ;

}

/∗−−− C a r g a r C e r t i f i c a d o s −−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗Carga l o s c e r t i f i c a d o s d e l s e r v i d o r y CA −−−−−−−∗/

void Carga rCe r t i f i c ado s (SSL CTX∗ ctx , char∗ CertFi l e , char∗KeyFile ) {

/∗ Asigna e l c e r t i f i c a d o a l c o n t e x t o ∗/i f ( SSL CTX us e c e r t i f i c a t e f i l e ( ctx , CertFi l e ,

SSL FILETYPE PEM) <= 0 ) {p r i n t f ( ”No se pudo usar e l a rch ivo de c e r t i f i c a d o \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;abort ( ) ;

} else {p r i n t f ( ” Ce r t i f i c a d o cargado \n” ) ;

}/∗ Asigna l a l l a v e primaria a l c o n t e x t o ∗/i f ( SSL CTX use PrivateKey f i le ( ctx , KeyFile ,

SSL FILETYPE PEM) <= 0 ) {p r i n t f ( ”No se pudo usar e l a rch ivo de l l a v e \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;abort ( ) ;

} else {p r i n t f ( ”Llave cargada . \n” ) ;

}/∗ Se hace una v e r i f i c a c i o n de l a l l a v e ∗/i f ( ! SSL CTX check private key ( ctx ) ) {

p r i n t f ( ”No se pudo usar e l a rch ivo de c e r t i f i c a d o \n” ) ;f p r i n t f ( s tde r r , ”La l l a v e pr imar ia no corresponde \n” ) ;abort ( ) ;

} else {p r i n t f ( ” Ce r t i f i c a d o y Llave va l i d o s . \n” ) ;

}}

/∗−−− M o s t r a r C e r t i f i c a d o s −−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗ Imprime l o s c e r t i f i c a d o s −−−−−−−−−−−−−−−−−−−−−−−−−∗/

void Most ra rCer t i f i c ado s (SSL∗ s s l ){ X509 ∗ c e r t ;

char ∗ l i n e ;

Page 26: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 26

c e r t = SSL g e t p e e r c e r t i f i c a t e ( s s l ) ;/∗ Mapeo de l o s c e r t i f i c a d o s a X509 ∗/

i f ( c e r t != NULL ) {p r i n t f ( ” C e r t i f i c a d o s de l s e r v i d o r :\n” ) ;l i n e = X509 NAME oneline ( X509 get subject name ( c e r t ) , 0 ,

0) ;/∗ Obtencion d e l s u b j e c t ∗/

p r i n t f ( ” Subject : %s \n” , l i n e ) ;f r e e ( l i n e ) ;l i n e = X509 NAME oneline ( X509 get i s suer name ( c e r t ) , 0 ,

0) ;/∗ Obtencion d e l emisor ∗/

p r i n t f ( ”Emisor : %s \n” , l i n e ) ;f r e e ( l i n e ) ;X509 f ree ( c e r t ) ;

/∗ Se l i b e r a n l o s datos d e l c e r t i f i c a d o ∗/} else {

p r i n t f ( ”No hay c e r t i f i c a d o s .\n” ) ;}

}

/∗−−− Se rv id or −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗R e a l i z a r e l procedimiento s e r v i c i o −−−−−−−−−−−−−−−∗/

void Serv idor (SSL∗ s s l ) {/∗ Proporciona l a f u n c i o n a l i d a d d e l s e r v i d o r ∗/

char buf [ 1 0 2 4 ] ;char r ep ly [ 1 0 2 4 ] ;int sd , bytes ;const char∗ HTMLecho=”Esto s o l o es un mensaje ISO01 |EOF” ;

p r i n t f ( ” I n i c i a Se rv idor \n” ) ;i f ( SSL accept ( s s l ) == FAIL ) {/∗ Se hace e l accep t − SSL ∗/

p r i n t f ( ”Hubo un e r r o r en e l SSL accept \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;

} else {p r i n t f ( ” SSL accept fue ex i t o s o \n” ) ;Mos t ra rCer t i f i c ado s ( s s l ) ;

/∗ Obtiene e imprime l o s c e r t i f i c a d o s ∗/bytes = SSL read ( s s l , buf , s izeof ( buf ) ) ;

/∗ Espera una p e t i c i o n d e l c l i e n t e ∗/i f ( bytes > 0 ) {

buf [ bytes ] = 0 ;

Page 27: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 27

p r i n t f ( ”Mensaje c l i e n t e : \” %s \”\n” , buf ) ;s p r i n t f ( rep ly , HTMLecho , buf ) ;

/∗ Imprime p e t i c i o n d e l c l i e n t e ∗/s l e e p (15) ;

SSL write ( s s l , rep ly , s t r l e n ( r ep ly ) ) ;/∗ Envıa una r e s p u e s t a a l c l i e n t e ∗/}else

ERR pr in t e r ro r s fp ( s t d e r r ) ;}sd = SSL get fd ( s s l ) ;

/∗ Obtiene l a conexi on d e l s o c k e t ∗/SSL free ( s s l ) ;

/∗ Libera e l e s tado SSL d e l c l i e n t e ∗/c l o s e ( sd ) ;

/∗ Cierra l a conexi on a l c l i e n t e ∗/}

/∗−−− Main −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗Se encarga de crear e l s e r v i d o r −−−−−−−−−−−−−−−−−−∗/

int main ( int count , char ∗ s t r i n g s [ ] ) {SSL CTX ∗ ctx ;

/∗ Se crea un c o n t e x t o para implementarse ∗/int s e r v e r ;

/∗ Se va a usar para e l s o c k e t d e l s e r v i d o r ∗/char ∗portnum ;

/∗ Se usa como e l numero de puer to ∗/SSL l i b r a r y i n i t ( ) ;

/∗ I n i c i a l i z a c i o n de l a s l ı b r e r i a s SSL !IMPORTANTE” ∗//∗ Esto se r e q u i e r e en s i s t e mas o p e r a t i v o s d i f e r e n t e s ∗//∗ de s o l a r i s ∗/

i f ( count != 2 ) {p r i n t f ( ”Uso : %s <portnum>\n” , s t r i n g s [ 0 ] ) ;e x i t (0 ) ;

}portnum = s t r i n g s [ 1 ] ;ctx = Inic iarCTXServidor ( ) ;

/∗ Se i n i c i a l i z a e l SSL para e l c o n t e x t o Server ∗/Carga rCe r t i f i c ado s ( ctx , ” se rv . pem” , ” se rv . key” ) ;

/∗ Carga l o s c e r t i f i c a d o s d e l s e r v i d o r ∗/s e r v e r = CrearSocket ( a t o i ( portnum) ) ;

/∗ Crea e l s o c k e t normal para e l s e r v i d o r ∗/p r i n t f ( ”Esperando por conex iones [ %d ] \n” , s e r v e r ) ;

Page 28: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 28

p r i n t f ( ” I n i c i a a aceptar conex iones \n” ) ;while (1 ) {

struct sockaddr in addr ;int l en = s izeof ( addr ) ;SSL ∗ s s l ;int c l i e n t = accept ( se rver , ( struct sockaddr ∗)&addr , &

l en ) ;/∗ Esta en es tado de acep tar conex iones ∗/

p r i n t f ( ”Connection : %d: %d\n” ,i n e t n t oa ( addr . s i n addr ) , ntohs ( addr . s i n p o r t ) ) ;

/∗ Muestra l o s datos d e l usuar io que se conecta ∗/

SSL CTX set ver i fy ( ctx , SSL VERIFY PEER, NULL) ;/∗V e r i f i c a e l c e r t i f i c a d o d e l s e r v i d o r ∗/

i f ( ! SSL CTX load ver i f y l oca t i ons ( ctx , ” ca c e r t . pem” ,NULL) ) {f p r i n t f ( s tde r r , ” Ce r t i f i c a do Inva l i do \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;e x i t (1 ) ;

}/∗Se hace una v e r i f i c a c i o n d e l c e r t i f i c a d o mediante l a CA ∗/

s s l = SSL new ( ctx ) ;/∗ Se o b t i e n e e l nuevo es tado SSL con su c o n t e x t o ∗/

SSL se t fd ( s s l , c l i e n t ) ;/∗ Se as igna e l s o c k e t a l e s tado SSL para c l i e n t e ∗/

Serv idor ( s s l ) ;/∗ Proporciona l a f u n c i o n a l i d a d d e l s e r v i d o r ( s e r v i c i o ) ∗/}c l o s e ( s e r v e r ) ;

/∗ Cierra e l s o c k e t d e l s e r v i d o r ∗/SSL CTX free ( ctx ) ;

/∗ Libera l a conexi on ∗/}

Espero haya quedado claro la programacion del servidor, ya que a partirde esta tendremos que generar el cliente tomando en cuenta el uso de losmismos certificados, ademas del mismo cipher y por su puesto el mismohandshake en el cual se comunican, cabe mencionar que en un socket normalel envıo de la informacion lo hacemos en base a write, read, send o recvdependiendo del si son caracteres o bytes los enviados, pero en este casousamos dos funciones propias de la librerıa openssl.h que son SSL write ySSL read, con lo que aseguramos el cifrado de la informacion que se transmitepor la red.

Page 29: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 29

Ahora es hora de programar el cliente.

4.2. CLIENTE

#include <s t d i o . h>#include <errno . h>#include <uni s td . h>#include <malloc . h>#include <s t r i n g . h>#include <sys / socket . h>

/∗ L i b r e r ı a para l o s s o c k e t ∗/#include <r e s o l v . h>#include <netdb . h>#include <opens s l / s s l . h>

/∗ L i b r e r ı a de o p e n s s l para l a f u n c i o n a l i d a d y c o n t e x t o s ∗/#include <opens s l / e r r . h>

/∗ L i b r e r ı a de o p e n s s l para e r r o r e s ∗/#define FAIL −1

/∗−−− CrearSocket −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗Crea un s o c k e t normal para implementar le SSL −−−−−∗/

int CrearSocket ( int port ) {int sd ;struct sockaddr in addr ;sd = socket (PF INET , SOCK STREAM, 0) ;bzero(&addr , s izeof ( addr ) ) ;addr . s i n f am i l y = AF INET ;addr . s i n p o r t = htons ( port ) ;addr . s i n addr . s addr = INADDR ANY;i f ( bind ( sd , ( struct sockaddr ∗)&addr , s izeof ( addr ) ) != 0 ){per ro r ( ”Error a l l i g a r e l socke t ” ) ;abort ( ) ;

}i f ( l i s t e n ( sd , 10) != 0 ) {

per ro r ( ”Error en e l l i s t e n ” ) ;abort ( ) ;

}return sd ;

}

/∗−−− IniciarCTXServidor −−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗ I n i c i a l i z a e l s e r v i d o r y crea e l c o n t e x t o s e r v e r −∗/

Page 30: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 30

SSL CTX∗ In ic iarCTXServidor (void ) {SSL METHOD ∗method ;SSL CTX ∗ ctx ;OpenSSL add al l a lgor i thms ( ) ;/∗ Carga l o s c i p h e r s de c i f r a d o ∗/SSL l o ad e r r o r s t r i n g s ( ) ;/∗ Carga l o s mensajes de e rror de SSL ∗/method = SSLv2 server method ( ) ;/∗ Crea una i n s t a n c i a d e l metodo s e r v i d o r en SSLv2 ∗/ctx = SSL CTX new(method ) ;/∗ Crea e l c o n t e x t o para e l metodo de s e r v i d o r ∗/i f ( ctx == NULL ) {

ERR pr in t e r ro r s fp ( s t d e r r ) ;abort ( ) ;

}/∗ Se e l i g e l a s u i t e que se desea usar , en e s t e caso ”DES−

CBC3−SHA”∗/i f ( SSL CTX set c iphe r l i s t ( ctx , ”DES−CBC3−MD5” ) == 1) {

p r i n t f ( ” S i se pudo e s t a b l e c e r \n” ) ;} else {

p r i n t f ( ”No se pudo e s t a b l e c e r \n” ) ;}return ctx ;

}

/∗−−− C a r g a r C e r t i f i c a d o s −−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗Carga l o s c e r t i f i c a d o s d e l s e r v i d o r y CA −−−−−−−∗/

void Carga rCe r t i f i c ado s (SSL CTX∗ ctx , char∗ CertFi l e , char∗KeyFile ) {

/∗ Asigna e l c e r t i f i c a d o a l c o n t e x t o ∗/i f ( SSL CTX us e c e r t i f i c a t e f i l e ( ctx , CertFi l e ,

SSL FILETYPE PEM) <= 0 ) {p r i n t f ( ”No se pudo usar e l a rch ivo de c e r t i f i c a d o \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;abort ( ) ;

} else {p r i n t f ( ” Ce r t i f i c a d o cargado \n” ) ;

}/∗ Asigna l a l l a v e primaria a l c o n t e x t o ∗/i f ( SSL CTX use PrivateKey f i le ( ctx , KeyFile ,

SSL FILETYPE PEM) <= 0 ) {p r i n t f ( ”No se pudo usar e l a rch ivo de l l a v e \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;

Page 31: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 31

abort ( ) ;} else {

p r i n t f ( ”Llave cargada . \n” ) ;}/∗ Se hace una v e r i f i c a c i o n de l a l l a v e ∗/i f ( ! SSL CTX check private key ( ctx ) ) {

p r i n t f ( ”No se pudo usar e l a rch ivo de c e r t i f i c a d o \n” ) ;f p r i n t f ( s tde r r , ”La l l a v e pr imar ia no corresponde \n” ) ;abort ( ) ;

} else {p r i n t f ( ” Ce r t i f i c a d o y Llave va l i d o s . \n” ) ;

}}

/∗−−− M o s t r a r C e r t i f i c a d o s −−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗ Imprime l o s c e r t i f i c a d o s −−−−−−−−−−−−−−−−−−−−−−−−−∗/

void Most ra rCer t i f i c ado s (SSL∗ s s l ){ X509 ∗ c e r t ;

char ∗ l i n e ;

c e r t = SSL g e t p e e r c e r t i f i c a t e ( s s l ) ;/∗ Mapeo de l o s c e r t i f i c a d o s a X509 ∗/

i f ( c e r t != NULL ) {p r i n t f ( ” C e r t i f i c a d o s de l s e r v i d o r :\n” ) ;l i n e = X509 NAME oneline ( X509 get subject name ( c e r t ) , 0 ,

0) ;/∗ Obtenci on d e l s u b j e c t ∗/

p r i n t f ( ” Subject : %s \n” , l i n e ) ;f r e e ( l i n e ) ;l i n e = X509 NAME oneline ( X509 get i s suer name ( c e r t ) , 0 ,

0) ;/∗ Obtenci on d e l emisor ∗/

p r i n t f ( ”Emisor : %s \n” , l i n e ) ;f r e e ( l i n e ) ;X509 f ree ( c e r t ) ;

/∗ Se l i b e r a n l o s datos d e l c e r t i f i c a d o ∗/} else {

p r i n t f ( ”No hay c e r t i f i c a d o s .\n” ) ;}

}

/∗−−− Se rv id or −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗R e a l i z a r e l procedimiento s e r v i c i o −−−−−−−−−−−−−−−∗/

Page 32: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 32

void Serv idor (SSL∗ s s l ) {/∗ Proporciona l a f u n c i o n a l i d a d d e l s e r v i d o r ∗/

char buf [ 1 0 2 4 ] ;char r ep ly [ 1 0 2 4 ] ;int sd , bytes ;const char∗ HTMLecho=”Esto s o l o es un mensaje ISO01 |EOF” ;

p r i n t f ( ” I n i c i a Se rv idor \n” ) ;i f ( SSL accept ( s s l ) == FAIL ) {/∗ Se hace e l accep t − SSL ∗/

p r i n t f ( ”Hubo un e r r o r en e l SSL accept \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;

} else {p r i n t f ( ” SSL accept fue ex i t o s o \n” ) ;Mos t ra rCer t i f i c ado s ( s s l ) ;

/∗ Obtiene e imprime l o s c e r t i f i c a d o s ∗/bytes = SSL read ( s s l , buf , s izeof ( buf ) ) ;

/∗ Espera una p e t i c i o n d e l c l i e n t e ∗/i f ( bytes > 0 ) {

buf [ bytes ] = 0 ;p r i n t f ( ”Mensaje c l i e n t e : \” %s \”\n” , buf ) ;s p r i n t f ( rep ly , HTMLecho , buf ) ;

/∗ Imprime p e t i c i o n d e l c l i e n t e ∗/s l e e p (15) ;

SSL write ( s s l , rep ly , s t r l e n ( r ep ly ) ) ;/∗ Envıa una r e s p u e s t a a l c l i e n t e ∗/}else

ERR pr in t e r ro r s fp ( s t d e r r ) ;}sd = SSL get fd ( s s l ) ;

/∗ Obtiene l a conexi on d e l s o c k e t ∗/SSL free ( s s l ) ;

/∗ Libera e l e s tado SSL d e l c l i e n t e ∗/c l o s e ( sd ) ;

/∗ Cierra l a conexi on a l c l i e n t e ∗/}

/∗−−− Main −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗Se encarga de crear e l s e r v i d o r −−−−−−−−−−−−−−−−−−∗/

int main ( int count , char ∗ s t r i n g s [ ] ) {SSL CTX ∗ ctx ;

/∗ Se crean un c o n t e x t o para implementarse ∗/int s e r v e r ;

Page 33: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 33

/∗ Se va a usar para e l s o c k e t d e l s e r v i d o r ∗/char ∗portnum ;

/∗ Se usa como e l numero de puer to ∗/SSL l i b r a r y i n i t ( ) ;

/∗ I n i c i a l i z a c i o n de l a s l i b r e r i a s SSL !IMPORTANTE” ∗/

i f ( count != 2 ) {p r i n t f ( ”Uso : %s <portnum>\n” , s t r i n g s [ 0 ] ) ;e x i t (0 ) ;

}portnum = s t r i n g s [ 1 ] ;ctx = Inic iarCTXServidor ( ) ;

/∗ Se i n i c i a l i z a e l SSL para e l c o n t e x t o Server ∗/Carga rCe r t i f i c ado s ( ctx , ” se rv . pem” , ” se rv . key” ) ;

/∗ Carga l o s c e r t i f i c a d o s d e l s e r v i d o r ∗/s e r v e r = CrearSocket ( a t o i ( portnum) ) ;

/∗ Crea e l s o c k e t normal para e l s e r v i d o r ∗/p r i n t f ( ”Esperando por conex iones [ %d ] \n” , s e r v e r ) ;p r i n t f ( ” I n i c i a a aceptar conex iones \n” ) ;while (1 ) {

struct sockaddr in addr ;int l en = s izeof ( addr ) ;SSL ∗ s s l ;int c l i e n t = accept ( se rver , ( struct sockaddr ∗)&addr , &

l en ) ;/∗ Esta en es tado de acep tar conex iones ∗/

p r i n t f ( ”Connection : %d: %d\n” ,i n e t n t oa ( addr . s i n addr ) , ntohs ( addr . s i n p o r t ) ) ;

/∗ Muestra l o s datos d e l usuar io que se conecta ∗/

SSL CTX set ver i fy ( ctx , SSL VERIFY PEER, NULL) ;/∗V e r i f i c a e l c e r t i f i c a d o d e l s e r v i d o r ∗/

i f ( ! SSL CTX load ver i f y l oca t i ons ( ctx , ” ca c e r t . pem” ,NULL) ) {f p r i n t f ( s tde r r , ” Ce r t i f i c a do Inva l i do \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;e x i t (1 ) ;

}/∗Se hace una v e r i f i c a c i o n d e l c e r t i f i c a d o mediante l a CA ∗/

s s l = SSL new ( ctx ) ;/∗ Se o b t i e n e e l nuevo es tado SSL con su c o n t e x t o ∗/

SSL se t fd ( s s l , c l i e n t ) ;/∗ Se as igna e l s o c k e t a l e s tado SSL para c l i e n t e ∗/

Serv idor ( s s l ) ;

Page 34: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 34

/∗ Proporciona l a f u n c i o n a l i d a d d e l s e r v i d o r ( s e r v i c i o ) ∗/}c l o s e ( s e r v e r ) ;

/∗ Cierra e l s o c k e t d e l s e r v i d o r ∗/SSL CTX free ( ctx ) ;

/∗ Libera l a conexi on ∗/}

Como veran el codigo es bastante similar, solo que en esta ocasion usamosel contexto de cliente.

4.3. Compilacion

Ahora vamos a correr el servidor y el cliente, obviamente el servidor vaprimero ya que si no se hace en ese orden, no tendrıamos hacia donde conec-tarnos para recibir el servicio, pero antes de ejecutarlos, compilemos:

root@koitoersv:/media/KINGSTON/Tutorial/Final/ServidorSSL#

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ssl/lib

root@koitoersv:/media/KINGSTON/Tutorial/Final/ServidorSSL# pwd

/media/KINGSTON/Tutorial/Final/ServidorSSL

root@koitoersv:/media/KINGSTON/Tutorial/Final/ServidorSSL# make server

gcc -g -c server.c

gcc -o server server.o -L/usr/local/ssl/include/

-L/usr/local/ssl/lib -lssl -lcrypto -lnsl -ldl

root@koitoersv:/media/KINGSTON/Tutorial/Final/ServidorSSL# ls

cacert.pem Makefile server server.c server.key server.o server.pem

root@koitoersv:/media/KINGSTON/Tutorial/Final/ServidorSSL#

Con esto habremos compilado el servidor Ahora compilamos el cliente enotra terminal

root@koitoersv:/media/KINGSTON/Tutorial/Final/ServidorSSL#

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ssl/lib

koitoer@koitoersv:/media/KINGSTON/Tutorial/Final/ClienteSSL$ pwd

/media/KINGSTON/Tutorial/Final/ClienteSSL

koitoer@koitoersv:/media/KINGSTON/Tutorial/Final/ClienteSSL$ make cliente

gcc -g -c cliente.c

gcc -o cliente cliente.o -L/usr/local/ssl/include/

Page 35: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 35

Figura 4.1: Inicio de ejecucion del servidor ssl

-L/usr/local/ssl/lib -lssl -lcrypto -lnsl -ldl

koitoer@koitoersv:/media/KINGSTON/Tutorial/Final/ClienteSSL$

Es importante resaltar el uso de la instruccion del export de la libreria, yaque si no se hace ası mandara errores al no encontrar la lıbreria libcrypto.ani libssl.a .

Ahora lo que haremos es correr el servidor en una ventana y el cliente enla otra.

Podemos ver que el servidor pide el passphrase de su certificado, en tantoel cliente no, debido a las modificaciones que realizamos en CA.sh, dondepodemos crear un certificado de servidor que no requiera el passphrase.

Ademas de que se observa, como se muestra la informacion de los certifi-cados, asi como su emisor en este caso la autoridad certificadora que somos

Page 36: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 36

Figura 4.2: Conexion con socket ssl

nostros mismos. Cuando lo corremos parece que es tardado pero recordemosque en el codigo existe un sleep de 5 segundos .

Gracias a wireshark que es un analizador de protocolos de red (sniffer)podemos ver que nuestra informacion no va en texto claro y que la comuni-cacion es lograda correctamente.

4.4. MAKE

Para compilar mas facilmente podemos hacer uso de un Makefile, recor-dando su sintaxis.

CC = gcc

Page 37: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 37

Aplicacion: server cliente

server: server.o

$(CC) -o server server.o -L/usr/local/ssl/include/

-L/usr/local/ssl/lib -lssl -lcrypto -lnsl -ldl

server.o: server.c

$(CC) -g -c server.c

cliente: cliente.o

$(CC) -o cliente cliente.o -L/usr/local/ssl/include/

-L/usr/local/ssl/lib -lssl -lcrypto -lnsl -ldl

cliente.o: cliente.c

$(CC) -g -c cliente.c

cipher:

/usr/local/ssl/bin/openssl ciphers -v ’ALL:!ADH:@STRENGTH’

clean:

rm *.o

Bien con esto tenemos un cliente SSL y un servidor SSL, que solo semandan mensaje entre sı. Si ejecutamos varios clientes a la vez, veremos queel servidor solo podra responder a uno por uno, aunque los otros los tengaen una cola tipo FIFO. Por lo que ahora programaremos un servidor queacepte varios clientes a la vez, esto lo haremos usando el mismo certificadodel servidor, ya previamente hecho.

Page 38: SSL + PTHREADS (spanish)

PARTE 4. CODIGOS FUENTES 38

Figura 4.3: Conexion con sockets sin ssl

Page 39: SSL + PTHREADS (spanish)

Parte 5

Servidor Multihilo

5.1. SERVER

Hasta este punto hemos logrado un server que acepta conexiones pero solouna a la vez, es cierto que tiene una cola de espera, pero no les puede darservicio a mas de un cliente a la vez, como lo pueden corroborar si ejecutanen dos consolas a dos clientes, ya que en el codigo del servidor puse un sleep5 que ponen en espera al cliente 5 segundos, entonces en este caso nuestroservidor solo atiende a uno a la vez, pero vamos que es un servidor si no puededar servicio a mas de un cliente a la vez. Para lograr lo antes mencionadoharemos uso de la implementacion de pthread, que es conocido como POSIXThread.

Para esto no deseo modificar los codigos anteriores, ni decirles que parte semodifica, ni que lıneas, ya que puede resultar confuso y tal vez no funcione alfinal, por lo que hacer un nuevo servidor en otro fichero, en el caso del clienteno tendremos que hacerle ninguna modificacion debido a que la funcionalidadde multihilos la da el servidor no el cliente. Otra cosa que se tendra quemodificar es el makefile, ya que al usar pthread deberemos de usar -lpthreadal compilar nuestros programas, ademas de incluir lıbrerias extras.

En el codigo del serverthread.c he quitado todos los comentarios anterioresdel SSL, y solo deje los que explican la parte de los hilos y concurrencia.

#include <s t d i o . h>#include <errno . h>#include <uni s td . h>#include <malloc . h>

39

Page 40: SSL + PTHREADS (spanish)

PARTE 5. SERVIDOR MULTIHILO 40

#include <s t r i n g . h>#include <sys / socket . h>#include <r e s o l v . h>#include <netdb . h>#include <opens s l / s s l . h>#include <opens s l / e r r . h>#include <pthread . h>

/∗ L i b r e r ı a de POXIS thread ∗/#define FAIL −1#define NUM THREADS 5

/∗Estruc tura que se usara como argumento∗/struct thread data {

int th r ead id ;/∗ I d e n t i d i f i c a d o r de h i l o ∗/SSL ∗message ;/∗ Estado s s l de l a conexi on ∗/

} ;

/∗−−− CrearSocket −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗Crea un s o c k e t normal para implementar le SSL −−−−−∗/

int CrearSocket ( int port ) {int sd ;struct sockaddr in addr ;

sd = socket (PF INET , SOCK STREAM, 0) ;bzero(&addr , s izeof ( addr ) ) ;addr . s i n f am i l y = AF INET ;addr . s i n p o r t = htons ( port ) ;addr . s i n addr . s addr = INADDR ANY;i f ( bind ( sd , ( struct sockaddr ∗)&addr , s izeof ( addr ) ) != 0 ){per ro r ( ”Error a l l i g a r e l socke t ” ) ;abort ( ) ;

}i f ( l i s t e n ( sd , 10) != 0 ) {

per ro r ( ”Error en e l l i s t e n ” ) ;abort ( ) ;

}return sd ;

Page 41: SSL + PTHREADS (spanish)

PARTE 5. SERVIDOR MULTIHILO 41

}

/∗−−− IniciarCTXServidor −−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗ I n i c i a l i z a e l s e r v i d o r y crea e l c o n t e x t o s e r v e r −∗/

SSL CTX∗ In ic iarCTXServidor (void ) {SSL METHOD ∗method ;SSL CTX ∗ ctx ;OpenSSL add al l a lgor i thms ( ) ;S SL l o ad e r r o r s t r i n g s ( ) ;method = SSLv2 server method ( ) ;ctx = SSL CTX new(method ) ;i f ( ctx == NULL ) {

ERR pr in t e r ro r s fp ( s t d e r r ) ;abort ( ) ;

}

i f ( SSL CTX set c iphe r l i s t ( ctx , ”DES−CBC3−MD5” ) == 1) {p r i n t f ( ” S i se pudo e s t a b l e c e r \n” ) ;

} else {p r i n t f ( ”No se pudo e s t a b l e c e r \n” ) ;

}return ctx ;

}

/∗−−− C a r g a r C e r t i f i c a d o s −−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗Carga l o s c e r t i f i c a d o s d e l s e r v i d o r y CA −−−−−−−∗/

void Carga rCe r t i f i c ado s (SSL CTX∗ ctx , char∗ CertFi l e , char∗KeyFile ) {

i f ( SSL CTX us e c e r t i f i c a t e f i l e ( ctx , CertFi l e ,SSL FILETYPE PEM) <= 0 ) {p r i n t f ( ”No se pudo usar e l a rch ivo de c e r t i f i c a d o \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;abort ( ) ;

} else {p r i n t f ( ” Ce r t i f i c a d o cargado \n” ) ;

}

i f ( SSL CTX use PrivateKey f i le ( ctx , KeyFile ,SSL FILETYPE PEM) <= 0 ) {p r i n t f ( ”No se pudo usar e l a rch ivo de l l a v e \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;abort ( ) ;

Page 42: SSL + PTHREADS (spanish)

PARTE 5. SERVIDOR MULTIHILO 42

} else {p r i n t f ( ”Llave cargada . \n” ) ;

}

i f ( ! SSL CTX check private key ( ctx ) ) {p r i n t f ( ”No se pudo usar e l a rch ivo de c e r t i f i c a d o \n” ) ;f p r i n t f ( s tde r r , ”La l l a v e pr imar ia no corresponde a l

c e r t i f i c a d o pub l i co \n” ) ;abort ( ) ;

} else { struct thread data {int th r ead id ;int sum ;char ∗ s s l s o c k e t ;

} ;

p r i n t f ( ” Ce r t i f i c a d o y Llave va l i d o s . \n” ) ;}

}

/∗−−− M o s t r a r C e r t i f i c a d o s −−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗ Imprime l o s c e r t i f i c a d o s −−−−−−−−−−−−−−−−−−−−−−−−−∗/

void Most ra rCer t i f i c ado s (SSL∗ s s l ){ X509 ∗ c e r t ;

char ∗ l i n e ;

c e r t = SSL g e t p e e r c e r t i f i c a t e ( s s l ) ;i f ( c e r t != NULL ) {

p r i n t f ( ” C e r t i f i c a d o s de l s e r v i d o r :\n” ) ;l i n e = X509 NAME oneline ( X509 get subject name ( c e r t ) , 0 ,

0) ;p r i n t f ( ” Subject : %s \n” , l i n e ) ;f r e e ( l i n e ) ;l i n e = X509 NAME oneline ( X509 get i s suer name ( c e r t ) , 0 ,

0) ;p r i n t f ( ”Emisor : %s \n” , l i n e ) ;f r e e ( l i n e ) ;X509 f ree ( c e r t ) ;

} else {p r i n t f ( ”No hay c e r t i f i c a d o s .\n” ) ;

}}

Page 43: SSL + PTHREADS (spanish)

PARTE 5. SERVIDOR MULTIHILO 43

/∗−−− Se rv id or −−−−−−−−−− −−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗R e a l i z a r e l procedimiento s e r v i c i o −−−−−−−−−−−−−−−∗/

void ∗ Serv idor (void ∗ threadarg ) {char buf [ 1 0 2 4 ] ;char r ep ly [ 1 0 2 4 ] ;int sd , bytes ;const char∗ HTMLecho=”Esto s o l o es e l mensaje de mi s e r v i d o r

SSL mu l t i h i l o ” ;

/∗Estruc tura donde se guardan l o s parametros de l o s t h r e a d s∗/

struct thread data ∗my data ;int t a sk id ;

/∗Parser de l o s datos de l a e s t r u c t u r a a v a r i a b l e s ∗/my data = ( struct thread data ∗) threadarg ;t a sk id = my data−>th r ead id ;SSL ∗ s s l = my data−>s s l s o c k e t ;

p r i n t f ( ” I n i c i a Se rv idor \n” ) ;i f ( SSL accept ( s s l ) == FAIL ) {

p r i n t f ( ”Hubo un e r r o r en e l SSL accept \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;

} else {p r i n t f ( ” SSL accept fue ex i t o s o \n” ) ;Mos t ra rCer t i f i c ado s ( s s l ) ;bytes = SSL read ( s s l , buf , s izeof ( buf ) ) ;i f ( bytes > 0 ) {

buf [ bytes ] = 0 ;p r i n t f ( ”Mensaje c l i e n t e : \” %s \”\n” , buf ) ;s p r i n t f ( rep ly , HTMLecho , buf ) ;

s l e e p (5 ) ;SSL write ( s s l , rep ly , s t r l e n ( r ep ly ) ) ;

}else

ERR pr in t e r ro r s fp ( s t d e r r ) ;}sd = SSL get fd ( s s l ) ;SSL f ree ( s s l ) ;c l o s e ( sd ) ;

}

Page 44: SSL + PTHREADS (spanish)

PARTE 5. SERVIDOR MULTIHILO 44

/∗−−− Main −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−∗//∗Se encarga de crear e l s e r v i d o r −−−−−−−−−−−−−−−−−−∗/

int main ( int count , char ∗ s t r i n g s [ ] ) {pthread t threads [NUM THREADS] ; /∗ Arreg lo de h i l o s ∗/struct thread data thread data a r ray [NUM THREADS] ;int t =0;int rc ;SSL CTX ∗ ctx ;int s e r v e r ;char ∗portnum ;SSL l i b r a r y i n i t ( ) ;

i f ( count != 2 ) {p r i n t f ( ”Uso : %s <portnum>\n” , s t r i n g s [ 0 ] ) ;e x i t (0 ) ;

}portnum = s t r i n g s [ 1 ] ;ctx = Inic iarCTXServidor ( ) ;Ca rga rCe r t i f i c ado s ( ctx , ” se rv . pem” , ” se rv . key” ) ;s e r v e r = CrearSocket ( a t o i ( portnum) ) ;p r i n t f ( ”Esperando por conex iones [ %d ] \n” , s e r v e r ) ;p r i n t f ( ” I n i c i a a aceptar conex iones \n” ) ;while (1 ) {

struct sockaddr in addr ;SSL ∗ s s l ;

int l en = s izeof ( addr ) ;int c l i e n t = accept ( se rver , ( struct sockaddr ∗)&addr , &

l en ) ;p r i n t f ( ”Connection : %d: %d\n” ,

i n e t n t oa ( addr . s i n addr ) , ntohs ( addr . s i n p o r t ) ) ;

SSL CTX set ver i fy ( ctx , SSL VERIFY PEER, NULL) ;i f ( ! SSL CTX load ver i f y l oca t i ons ( ctx , ” ca c e r t . pem” ,

NULL) ) {f p r i n t f ( s tde r r , ” Ce r t i f i c a do Inva l i do \n” ) ;ERR pr in t e r ro r s fp ( s t d e r r ) ;e x i t (1 ) ;

}

s s l = SSL new ( ctx ) ;

Page 45: SSL + PTHREADS (spanish)

PARTE 5. SERVIDOR MULTIHILO 45

/∗Se crea c o n t e x t o ∗/SSL se t fd ( s s l , c l i e n t ) ;

t++;/∗Se da numero de pthread ∗/th r ead data a r ray [ t ] . t h r ead id = t ;/∗Se l e da e l id d e l thread a l thread ∗/

th r ead data a r ray [ t ] . message = s s l ;/∗Se l e da e l as igna e l c o n t e x t o de l a conexi on a l thread ∗/

rc = pthr ead c r ea t e (&threads [ t ] , NULL, Se rv l e t , (void ∗)&thread data a r ray [ t ] ) ;

/∗Se crea e l h i l o y se l e manda l a e s t r u c t u r a l l e n a d apreviamente ∗/

}c l o s e ( s e r v e r ) ;SSL CTX free ( ctx ) ;

}

Con lo que tenemos el servidor de hilos, y lo ejecutamos de la mismaforma que el servidor sin hilos.

root@koitoersv:/media/KINGSTON/Tutorial/Final/ServidorSSLMultihilo#

make serverthread

gcc -c -o serverthread.o serverthread.c

gcc -o serverthread serverthread.o -L/usr/local/ssl/include/

-L/usr/local/ssl/lib -lssl -lcrypto -lnsl -ldl -lpthread

root@koitoersv:/media/KINGSTON/Tutorial/Final/ServidorSSLMultihilo#

Ahora vemos en la siguiente pantalla como es la ejecucion en 3 pantallasdel servidor ssl multithread.

Como vemos si ejecutamos todos al mismo tiempo, todos terminan almismo tiempo debido a que se tiene un servidor que puede procesar variaspeticiones aparentemente al mismo tiempo, como vemos al cliente se le pasala direccion IP o direccion local o nombre de dominio y el puerto en el cuallevantamos el servidor. Obviamente el mensaje del cliente y el servidor sonestaticos, podriamos hacer la modificacion para que los mensajes los leyeradesde lınea de comandos, pero eso es ya otra historia y sale del contexto deeste tutorial.

Page 46: SSL + PTHREADS (spanish)

PARTE 5. SERVIDOR MULTIHILO 46

Figura 5.1: Inicio de ejecucion de multihilo ssl (Comandos)

Page 47: SSL + PTHREADS (spanish)

PARTE 5. SERVIDOR MULTIHILO 47

Figura 5.2: Inicio de ejecucion de multihilo ssl (Corriendo)

Page 48: SSL + PTHREADS (spanish)

Parte 6

Conclusion e ideas finales

6.1. Problemas principales

Esta seccion es la ultima que escribo con los posibles problemas quepueden llegar a tener y algunos con los que yo me enfrente.

6.1.1. Creacion de certificados

Un problema que llega a ocurrir, es que despues de colocar la informacionpara generar al certificado de CA, cliente o de server, el programa CA.shmande este mensaje:

Enter pass phrase for ./demoCA/private/./cakey.pem:

unable to load CA private key

13881:error:06065064:digital envelope routines:EVP_DecryptFinal_ex

:bad decrypt:evp_enc.c:461:

13881:error:0906A065:PEM routines:PEM_do_header

:bad decrypt:pem_lib.c:425:

Con lo que hace referencia que la passhprase del CA es incorrecta.Otro error comun es que salgan las siguientes lineas:

koitoer@koitoersv:~ /usr/lib/ssl/misc/CA.sh -newca

mkdir: cannot create directory ‘./demoCA’: File exists

48

Page 49: SSL + PTHREADS (spanish)

PARTE 6. CONCLUSION 49

mkdir: cannot create directory ‘./demoCA/certs’: File exists

mkdir: cannot create directory ‘./demoCA/crl’: File exists

mkdir: cannot create directory ‘./demoCA/newcerts’: File exists

mkdir: cannot create directory ‘./demoCA/private’: File exists

Lo unico que tendremos que hacer es un rm -rf ./demoCA para borrarlos directorios.

Por ultimo a veces sucede que sale un error parecido a este

Enter pass phrase for ./demoCA/private/./cakey.pem:

/*Marca que algo no existe y no lo puede crear */

Lo que se tiene que revisar es el openssl.cnf para saber a donde esta apuntandola creacion de los certificados.

6.1.2. Firewall

Otro punto importante es que al usar sockets, ocupamos una o variasdirecciones IP’s y puertos, por lo que si elegimos un puerto por debajo del1024 tendremos que usar permisos de root, ademas de que dependiendo dela configuracion los puertos pueden estar bloqueados por un firewall, por loque tendremos que configurarlo para permitir el acceso a estos. En este casoharemos uso de iptables.

#netstat -a

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 *:1025 *:* LISTEN

tcp 0 0 localhost:50246 localhost:1025 ESTABLISHED

tcp 0 0 localhost:1025 localhost:50246 ESTABLISHED

tcp 0 0 localhost:50245 localhost:1025 TIME_WAIT

Ahora realizamos las configuraciones para abrir el puerto por si estuviesebloqueado.

iptables -A INPUT -p tcp -s 0/0 -d 127.0.0.1/24

--destination-port 1025 -j ACCEPT

Page 50: SSL + PTHREADS (spanish)

PARTE 6. CONCLUSION 50

Figura 6.1: Iptables desbloqueando puerto

Page 51: SSL + PTHREADS (spanish)

PARTE 6. CONCLUSION 51

Figura 6.2: Iptables bloqueando puerto

O por si lo queremos bloquear XD

iptables -A INPUT -p tcp -s 0/0 -d 127.0.0.1/24

--destination-port 1025 -j DROP

Con lo que vemos que cuando se bloquea se produce un timeout en elcliente.

6.2. Tutoriales futuros

El siguiente tutorial que he empezado es la implementacion de un socketcrudo que permita la creacion de un pequeno sniffer, ademas de unos ejemplosde uso de los sockets crudos, que como tal nos permiten la implementacion

Page 52: SSL + PTHREADS (spanish)

PARTE 6. CONCLUSION 52

de nuevos protocolos o la posibilidad de alterar informacion en protocolosexistentes.

6.3. Ideas Finales

Espero que este tutorial les haya servido como guıa para adentrarse enel mundo del socket programming, en este caso es cierto java y c++, vanganando adeptos y terreno dıa con dıa, pero vamos siempre es bueno empezaren los origenes con C. Y aunque muchas personas creen que el lenguaje Ces obsoleto en estos dıas, les puedo decir sin temor a equivocarme que tienemuchas aplicaciones, y una que personalmente llegue a manejar es en la partede envıo de la tramas bancarias a traves de la red y al ser informacion sensiblese ocupa cifrado.

Espero tambien disculpen mis faltas de ortografıa y mi redaccion, si enalgun momento consideran que esta mal. Cualquier aclaracion, duda o co-mentario me pueden contactar a este correo. (([email protected]))

Este tutorial es dedicado a cada una de las personas que conocı en mipaso por la Facultad de Ingenierıa, UNAM.

Los codigos del tutorial estan en esta pagina:http://www.koitoer.com/tutoriales/opensslthread.tar.gz

Este tutorial fue creado en LATEX.

6.4. Agradecimientos

Un agradecimiento muy especial Martha Velasco Jimenez, por la valiosacorreccion que hizo a este documento, GRACIAS.


Recommended