ssl + pthreads (spanish)
Post on 16-Nov-2014
394 Views
Preview:
DESCRIPTION
TRANSCRIPT
Programacion con Sockets Secure Layer yPthreads
Ing. Mauricio Mena Corteskoitoer
28 de abril de 2009
1
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
INDICE GENERAL 3
6.4. Agradecimientos . . . . . . . . . . . . . . . . . . . . . . . . . 52
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
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
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.
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
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.
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
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 []:koitoer.company@gmail.com
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:
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 = koitoer.company@gmail.com
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./emailAddress=koitoer.company@gmail.com
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-
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 []:koitoer.server@gmail.com
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 = koitoer.server@gmail.com
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
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./emailAddress=koitoer.company@gmail.com
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/emailAddress=koitoer.server@gmail.com
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
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-----
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.
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
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 []:koitoer.cliente@gmail.com
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 = koitoer.cliente@gmail.com
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:
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./emailAddress=koitoer.company@gmail.com
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/emailAddress=koitoer.cliente@gmail.com
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:
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==
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
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
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
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” ) ;
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 ;
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 ;
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 ) ;
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.
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 −∗/
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 ) ;
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 −−−−−−−−−−−−−−−∗/
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 ;
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 ) ;
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/
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
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
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.
PARTE 4. CODIGOS FUENTES 38
Figura 4.3: Conexion con sockets sin ssl
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
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 ;
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 ( ) ;
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” ) ;
}}
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 ) ;
}
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 ) ;
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.
PARTE 5. SERVIDOR MULTIHILO 46
Figura 5.1: Inicio de ejecucion de multihilo ssl (Comandos)
PARTE 5. SERVIDOR MULTIHILO 47
Figura 5.2: Inicio de ejecucion de multihilo ssl (Corriendo)
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
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
PARTE 6. CONCLUSION 50
Figura 6.1: Iptables desbloqueando puerto
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
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. ((koitoer.server@gmail.com))
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.
top related