MySQL + SSL

Olá, estou com o seguinte problema

No trabalho consegui implementar um servidor MySQL que aceita conexões ssl, a conexão funcionou e tudo ok.
Porém, em casa,nao consigo fazer funcionar, fiz exatamente a mesma coisa que fiz no trabalho, porem aqui não funciona.

O procedimento para gerar a chave foi :

# Create CA certificate
shell> openssl genrsa 2048 > ca-key.pem
shell> openssl req -new -x509 -nodes -days 1000 \
         -key ca-key.pem > ca-cert.pem

# Create server certificate
shell> openssl req -newkey rsa:2048 -days 1000 \
         -nodes -keyout server-key.pem > server-req.pem
shell> openssl x509 -req -in server-req.pem -days 1000 \
         -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

# Create client certificate
shell> openssl req -newkey rsa:2048 -days 1000 \
         -nodes -keyout client-key.pem > client-req.pem
shell> openssl x509 -req -in client-req.pem -days 1000 \
         -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

No arquivo /etc/mysql/my.cnf (esta lendo dele, mas também por via das duvidas editei o /etc/my,cnf)

Esta :

[code][client]
ssl-ca=/home/felipe/Documentos/MySQL/openssl/ca-cert.pem
ssl-cert=/home/felipe/Documentos/MySQL/openssl/client-cert.pem
ssl-key=/home/felipe/Documentos/MySQL/openssl/client-key.pem

[mysqld]
ssl-ca=/etc/mysql/certs/ca-cert.pem
ssl-cert=/etc/mysql/certs/server-cert.pem
ssl-key=/etc/mysql/certs/server-key.pem
[/code]

No trabalho está igualzinho, mesma configuração, e lá esta funcionando.
Porem aqui quando vou estar o mysqld ou até mesmo pelo service mysql ele da o seguinte erro :

110225 22:09:54 [Note] Plugin ‘FEDERATED’ is disabled.
110225 22:09:54 InnoDB: Started; log sequence number 0 87190
[color=red]SSL error: Unable to get certificate from '/etc/mysql/certs/server-cert.pem’
110225 22:09:54 [Warning] Failed to setup SSL
110225 22:09:54 [Warning] SSL error: Unable to get certificate
[/color]
110225 22:09:54 [Note] Event Scheduler: Loaded 0 events
110225 22:09:54 [Note] mysqld: ready for connections.
Version: ‘5.1.49-1ubuntu8.1’ socket: ‘/var/run/mysqld/mysqld.sock’ port: 3306 (Ubuntu)
110225 22:10:57 [Note] mysqld: Normal shutdown

110225 22:10:57 [Note] Event Scheduler: Purging the queue. 0 events
110225 22:10:57 InnoDB: Starting shutdown…
110225 22:11:00 InnoDB: Shutdown completed; log sequence number 0 87190

O que poderia estar acontecendo? Não encontro em forum algum a solução…nenhum mesmo
Obrigado

Conferiu se o arquivo server-cert.pem está no diretório certo? O mysql tem acesso de leitura nesse diretório? provavelmente é alguma coisa relacionada a privilégios. Dá uma olhada.

Sim, o dono do arquivo é o usuário normal do sistema, e mesmo assim , estou rodando o mysqld via root… através de
# mysqld -u root

por via das duvidas deixei o arquivo com permissões totais para todos os usuários,apenas para os testes, e mesmo assim não consegui.

O que há de diferente, é que aonde eu trabalho há o usuário mysql , pois o banco foi instalado na mão mesmo, criando o grupo,usuário,rodando scripts, etc
mas em casa instalei pelo apt mesmo. Mas isso faria alguma diferença?

Sim, faz diferençca. Os acessos precisam ser garantidos, mesmo o usuário root. Acredito que você precisa usar um chmod para dar privilégio para todos os usuários.

Descobri o que era o problema, e agradeço também a ajuda ‘visola’ (:

O problema foi o seguinte, o apparmor nao permitia que o MySQL tivesse acesso aos arquivos de certificados.
Não sei ao certo o papel do apparmor, sou usário Linux mas foi a primeira vez que ouvi falar de tal aplicativo.

Deu muito trabalho, mas enfim consegui achar perdido em um blog e em um bug reporta no site do MySQL.
Não sei se aqui no GUJ da para criar artigos, como no VOL … mas de qualquer forma irei colocar aqui a solução e algumas tags para maior sucesso em buscas no Google.
Peço a moderação que não deletem esse post, pois foi muito dificil achar a solução , muitas buscas em ingles e espanhol e nada nem parecido em portugues.


De inicio, basta seguir o que foi feito no começo do post, na duvida do forum. Criar os certificados com o openSSL apartir daqueles comandos em um terminal qualquer.
Observação importante : Quando for pedido um nome (common name(your name)), lembre-se de fazer distinção entre o preenchimento do nome do server e do client.

Depois disso, coloque os arquivos em sua pasta de preferencia. Como eu executo o servidor com o usuário root, ele ja tem as permissões de arquivo, porem, se utilzar o usuário mysql, não esqueça de alterar as permissões nas pastas e nos arquivos de certificado. Isso é muito importante como disse nosso amigo acima.

O próximo passo é editar o arquivo my.cnf.
A questão é que, há, em algumas instalações, dois ou mais arquivos my.cnf. Por exemplo, eu aprendi que o padrão era o mysqld usar como configuração o arquivo /etc/my.cnf. Porém aqui em casa ele está usando o /etc/mysql/my.cnf.

Faça alguns testes com váriaveis nos arquivos, para ver qual ele está usando, ou se não souber, coloque a config a seguir nos dois arquivos :

Adicione estas linhas no arquivo
[client]
ssl-ca=$DIR/ca-cert.pem
ssl-cert=$DIR/client-cert.pem
ssl-key=$DIR/client-key.pem
[mysqld]
ssl-ca=$DIR/ca-cert.pem
ssl-cert=$DIR/server-cert.pem
ssl-key=$DIR/server-key.pem

aonde $DIR é o caminho até se chegar no arquivo. Exemplo : ssl-cert=/etc/mysql/certificados/server-cert.pem
salve o arquivo e feche-o.

Após isso, execute no terminal
# mysqld -u root

O motivo para usar -u root, é que em algumas vezes ele da uma mensagem de erro, falando que não é possivel statar or serviço como root.
Verifique o arquivo /var/log/mysql/mysql.err (se foi configurado para haver este arquivo de erros (geralmente instalado quando usado um dpkg ou apt-get (ou rpm,yum)))
Verifique se há alguma mensagem de erro como por exemplo "SSL ERROR, UNABLED TO GET CERTIFICATE FROM …"
Observação importante : Caso tenha instalado o mysql sem ser por aplicativos de instalação, o arquivo de log estará em /diretório/de/instalação/mysql/data/usuário-desktop.err

Esse foi o erro que me travou por um tempo. Antes da solução, houve também um outro problema, mesmo com esse erro não aparecendo na iniciação do serviço, quando eu tentava conectar um usuárioo também dava um erro, muito mal documentado, que era simplesmente ERROR 2026 (HY000): SSL connection error… sem nenuma explicação do que poderia ser.
Ambos os problemas foram resolvidos configurando o AppArmor.

Existe um aplicativo no Linux, que eu mesmo não entendi muito bem para que serve, chamado AppArmor.
Tive que configurá-lo para fazer funcionar.e acreditem …apenas 1 linha resolveu tudo.

edite o arquivo /etc/apparmor.d/usr.sbin.mysqld

Haverá varias linhas nele, acrescente dentro dos ‘{ }’ a seguinte linha:

Modifique o caminho conforme o caminho da pasta de seus certificados.
o *.pem , pega todos os arquivos de certificados e as chaves, que estão com essa extensão.

Caso você não tenha o arquvio usr/sbin/mysqld , crie ele, segue um exemplo dele, já configurado com os certificados e chaves:

[code]
/usr/sbin/mysqld {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/user-tmp>
#include <abstractions/mysql>

capability dac_override,
capability setgid,
capability setuid,

/etc/hosts.allow r,
/etc/hosts.deny r,

/etc/group m,
/etc/passwd m,

/etc/mysql/.pem r,
/etc/mysql/
.crt r,
/etc/mysql/*.key r,

/etc/mysql/conf.d/ r,
/etc/mysql/conf.d/* r,
/etc/mysql/my.cnf r,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
}[/code]

Depois disso, reinicie o serviço do apparmor (service apparmor restart) e reinicie o serviço do mysql
Olhe o arquivo de erros, veja se há algo

Para checar se aconfiguração funcionou, faça o seguinte :
abra uma conexão mysql e digite :
SHOW VARIABLES LIKE ‘%ssl%’;

Devem aparecer duas váriaveis ssl, que devem estar com os valores como YES.
Caso apareça valores DISABLED, algo foi feito errado.

Quando conectar com um cliente, para verificar se esta conectando usando SSL, digite \s e procure por uma váriavel SSL. veja se aparece algo como Cipher in use is DHE-RSA-AES256-SHA.
Se aparecer, está ok e vc esta conectado via SSL no banco.
Caso apareça ‘not in use’, reveja os arquivos de configuração , refaça o processo todo, etc.

Agradeço.
Espero poder ajudar alguem.
Abraços.
Felipe