

# Usar SSL/TLS com uma instância de banco de dados do Amazon RDS para Db2
<a name="Db2.Concepts.SSL"></a>

O SSL é um protocolo padrão do setor para proteger as conexões de rede entre o cliente e o servidor. Após o SSL versão 3.0, o nome mudou para TLS, mas ainda costuma ser chamado de SSL. O Amazon RDS é compatível com criptografia SSL para instâncias de banco de dados do Amazon RDS para Db2. Usando o SSL/TLS, é possível criptografar uma conexão entre o cliente de aplicação e a instância de banco de dados do RDS para Db2. A compatibilidade com SSL/TLS está disponível em todas as Regiões da AWS para RDS para Db2.



Para habilitar a criptografia SSL/TLS para uma instância de banco de dados do RDS para Db2, adicione a opção Db2 SSL ao grupo de parâmetros associado à instância de banco de dados. O Amazon RDS usa uma segunda porta, conforme exigido pelo Db2, para conexões SSL/TLS. Isso permite que comunicações de texto sem formatação e de texto com criptografia SSL ocorram ao mesmo tempo entre uma instância de banco de dados e um cliente Db2. Por exemplo, você pode usar a porta com comunicação de texto simples para se comunicar com outros recursos dentro de uma VPC enquanto usa a porta com comunicação criptografada em SSL para se comunicar com recursos fora da VPC. 

**Topics**
+ [Criar uma conexão SSL/TLS](#db2-creating-ssl-connection)
+ [Conectar-se ao servidor de banco de dados do Db2](#db2-connecting-to-server-ssl)

## Criar uma conexão SSL/TLS
<a name="db2-creating-ssl-connection"></a>

Para criar uma conexão SSL/TLS, selecione uma autoridade de certificação (CA), baixe um pacote de certificados para todas as Regiões da AWS e adicione parâmetros a um grupo de parâmetros personalizado.

### Etapa 1: Selecionar uma CA e baixar um certificado
<a name="db2-creating-ssl-connection-prereq"></a>

Selecione uma autoridade de certificação (CA) e baixe um pacote de certificados para todas as Regiões da AWS. Para obter mais informações, consulte [Usar SSL/TLS para criptografar uma conexão com uma instância ou um cluster de banco de dados](UsingWithRDS.SSL.md).

### Etapa 2: Atualizar os parâmetros em um grupo de parâmetros personalizado
<a name="db2-updating-parameters-ssl"></a>

**Importante**  
Se você estiver usando o modelo traga a sua própria licença (BYOL) para RDS para Db2, modifique o grupo de parâmetros personalizado criado para o IBM Customer ID e o IBM Site ID. Se você estiver usando um modelo de licenciamento diferente para o RDS para Db2, siga o procedimento para adicionar parâmetros a um grupo de parâmetros personalizado. Para obter mais informações, consulte [Opções de licenciamento do Amazon RDS para Db2](db2-licensing.md). 

Não é possível modificar grupos de parâmetros padrão para instâncias de banco de dados do RDS para Db2. Portanto, é necessário criar um grupo de parâmetros personalizado, modificá-lo e associá-lo às instâncias de banco de dados do RDS para Db2. Para obter informações sobre grupos de parâmetros, consulte [Grupos de parâmetros de banco de dados para instâncias de banco de dados do Amazon RDS](USER_WorkingWithDBInstanceParamGroups.md).

 Use as configurações de parâmetros na tabela a seguir.


| Parâmetro | Valor | 
| --- | --- | 
| DB2COMM | TCPIP,SSL ou SSL | 
| SSL\$1SVCENAME | <any port number except the number used for the non-SSL port> | 

**Como atualizar os parâmetros em um grupo de parâmetros personalizado**

1. Crie um grupo de parâmetros personalizado executando o comando [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html). 

   Inclua as seguintes opções necessárias:
   + `--db-parameter-group-name`: um nome para o grupo de parâmetros que você está criando.
   + `--db-parameter-group-family`: a edição do mecanismo do Db2 e a versão principal. Valores válidos: `db2-se-11-5`, `db2-ae-11.5`. 
   + `--description`: a descrição desse grupo de parâmetros.

   Para obter mais informações sobre como criar um parameter group de banco de dados, consulte [Criar um grupo de parâmetros de banco de dados no Amazon RDS](USER_WorkingWithParamGroups.Creating.md).

1. Modifique os parâmetros no grupo de parâmetros personalizado que você criou executando o comando [https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html).

   Inclua as seguintes opções necessárias:
   + `--db-parameter-group-name`: o nome do grupo de parâmetros criado.
   + `--parameters`: uma matriz de nomes de parâmetros, valores e os métodos de aplicação da atualização de parâmetros.

   Para ter mais informações sobre como modificar um grupo de parâmetros, consulte [Modificar parâmetros em um grupo de parâmetros de banco de dados no Amazon RDS](USER_WorkingWithParamGroups.Modifying.md).

1. Associe o grupo de parâmetros à sua instância de banco de dados do RDS para Db2. Para obter mais informações, consulte [Associar um grupo de parâmetros de banco de dados a uma instância de banco de dados no Amazon RDS](USER_WorkingWithParamGroups.Associating.md).

## Conectar-se ao servidor de banco de dados do Db2
<a name="db2-connecting-to-server-ssl"></a>

As instruções para se conectar ao servidor de banco de dados do Db2 são específicas do idioma.

------
#### [ Java ]

**Como se conectar ao servidor de banco de dados do Db2 usando Java**

1. Baixe o driver JDBC. Para ter mais informações, consulte [DB2 JDBC Driver Versions and Downloads](https://www.ibm.com/support/pages/db2-jdbc-driver-versions-and-downloads) na documentação do IBM Support.

1. Crie um arquivo de script de shell com o conteúdo a seguir. Esse script adiciona todos os certificados do pacote a um Java KeyStore.
**Importante**  
Verifique se há uma `keytool` no caminho do script para que o script possa localizá-la. Se você usa um cliente Db2, pode localizar a `keytool` em `~sqlib/java/jdk64/jre/bin`.

   ```
   #!/bin/bash
   PEM_FILE=$1
   PASSWORD=$2
   KEYSTORE=$3
   # number of certs in the PEM file
   CERTS=$(grep 'END CERTIFICATE' $PEM_FILE| wc -l)
   for N in $(seq 0 $(($CERTS - 1))); do
       ALIAS="${PEM_FILE%.*}-$N"
       cat $PEM_FILE |
       awk "n==$N { print }; /END CERTIFICATE/ { n++ }" |
       keytool -noprompt -import -trustcacerts -alias $ALIAS -keystore $KEYSTORE -storepass $PASSWORD
   done
   ```

1. Para executar o script de shell e importar o arquivo PEM com o pacote de certificados em um Java KeyStore, execute o comando a seguir. Substitua *shell\$1file\$1name.sh* pelo nome do arquivo de script de shell, e *password* pela senha do Java KeyStore.

   ```
    ./shell_file_name.sh global-bundle.pem password truststore.jks
   ```

1. Para se conectar ao servidor Db2, execute o comando a seguir. Substitua os seguintes espaços reservados no exemplo pelas informações da instância de banco de dados do RDS para Db2.
   + *ip\$1address*: o endereço IP do endpoint de instância de banco de dados.
   + *port*: o número da porta para a conexão SSL. Pode ser qualquer número de porta, exceto o número usado para a porta não SSL.
   + *database\$1name*: o nome do banco de dados na instância de banco de dados.
   + *master\$1username*: o nome de usuário principal da sua instância de banco de dados.
   + *master\$1password*: a senha mestra da instância de banco de dados.

   ```
   export trustStorePassword=MyPassword
   java -cp ~/dsdriver/jdbc_sqlj_driver/linuxamd64/db2jcc4.jar \
   com.ibm.db2.jcc.DB2Jcc -url \
   "jdbc:db2://ip_address:port/database_name:\
   sslConnection=true;sslTrustStoreLocation=\
   ~/truststore.jks;\
   sslTrustStorePassword=${trustStorePassword};\
   sslVersion=TLSv1.2;\
   encryptionAlgorithm=2;\
   securityMechanism=7;" \
   -user master_username -password master_password
   ```

------
#### [ Node.js ]

**Como se conectar ao servidor de banco de dados do Db2 usando Node.js**

1. Instale o driver **node-ibm\$1db**. Para ter mais informações, consulte [Installing the node-ibm\$1db driver on Linux and UNIXsystems](https://www.ibm.com/docs/en/db2/11.5?topic=nodejs-installing-node-db-driver-linux-unix-systems) na documentação do IBM Db2.

1. Crie um arquivo JavaScript com base no conteúdo a seguir. Substitua os seguintes espaços reservados no exemplo pelas informações da instância de banco de dados do RDS para Db2.
   + *ip\$1address*: o endereço IP do endpoint de instância de banco de dados.
   + *master\$1username*: o nome de usuário principal da sua instância de banco de dados.
   + *master\$1password*: a senha mestra da instância de banco de dados.
   + *database\$1name*: o nome do banco de dados na instância de banco de dados.
   + *port*: o número da porta para a conexão SSL. Pode ser qualquer número de porta, exceto o número usado para a porta não SSL.

   ```
   var ibmdb = require("ibm_db");
   const hostname = "ip_address";
   const username = "master_username";
   const password = "master_password";
   const database = "database_name";
   const port = "port";
   const certPath = "/root/qa-bundle.pem";
   ibmdb.open("DRIVER={DB2};DATABASE=" + database + ";HOSTNAME=" + hostname + ";UID=" + username + ";PWD=" + password + ";PORT=" + port + ";PROTOCOL=TCPIP;SECURITY=SSL;SSLServerCertificate=" + certPath + ";", function (err, conn){
    if (err) return console.log(err);
    conn.close(function () {
    console.log('done');
    });
   });
   ```

1. Para alterar o arquivo JavaScript, execute o comando a seguir.

   ```
   node ssl-test.js
   ```

------
#### [ Python ]

**Como se conectar ao servidor de banco de dados do Db2 usando Python**

1. Crie um arquivo Python com o conteúdo a seguir. Substitua os seguintes espaços reservados no exemplo pelas informações da instância de banco de dados do RDS para Db2.
   + *port*: o número da porta para a conexão SSL. Pode ser qualquer número de porta, exceto o número usado para a porta não SSL.
   + *master\$1username*: o nome de usuário principal da sua instância de banco de dados.
   + *master\$1password*: a senha mestra da instância de banco de dados.
   + *database\$1name*: o nome do banco de dados na instância de banco de dados.
   + *ip\$1address*: o endereço IP do endpoint de instância de banco de dados.

   ```
   import click
   import ibm_db
   import sys
   
   port = port;
   master_user_id = "master_username" # Master id used to create your DB instance
   master_password = "master_password" # Master password used to create your DB instance
   db_name = "database_name" # If not given "db-name'
   vpc_customer_private_ip = "ip_address" # Hosts end points - Customer private IP Addressicert_path = "/root/ssl/global-bundle.pem" # cert path
   
   @click.command()        
   @click.option("--path", help="certificate path")
   def db2_connect(path):
   
       try:
           conn = ibm_db.connect(f"DATABASE={db_name};HOSTNAME={vpc_customer_private_ip};PORT={port};
               PROTOCOL=TCPIP;UID={master_user_id};PWD={master_password};SECURITY=ssl;SSLServerCertificate={path};", "", "")
           try:
               ibm_db.exec_immediate(conn, 'create table tablename (a int);')
               print("Query executed successfully")
           except Exception as e:
               print(e)
           finally:
               ibm_db.close(conn)
               sys.exit(1)
       except Exception as ex:
           print("Trying to connect...")
   
   if __name__ == "__main__":
       db2_connect()
   ```

1. Crie o script de shell a seguir, que executa o arquivo Python criado. Substitua *python\$1file\$1name.py* pelo nome do arquivo de script Python.

   ```
   #!/bin/bash
   PEM_FILE=$1
   # number of certs in the PEM file
   CERTS=$(grep 'END CERTIFICATE' $PEM_FILE| wc -l)
   
   for N in $(seq 0 $(($CERTS - 1))); do
       ALIAS="${PEM_FILE%.*}-$N"
       cert=`cat $PEM_FILE | awk "n==$N { print }; /END CERTIFICATE/ { n++ }"`
       cat $PEM_FILE | awk "n==$N { print }; /END CERTIFICATE/ { n++ }" > $ALIAS.pem
       python3 <python_file_name.py> --path $ALIAS.pem
       output=`echo $?`
       if [ $output == 1 ]; then
           break
       fi
   done
   ```

1. Para importar o arquivo PEM com o pacote de certificados e executar o script de shell, execute o comando a seguir. Substitua *shell\$1file\$1name.sh* pelo nome do arquivo de script de shell.

   ```
   ./shell_file_name.sh global-bundle.pem
   ```

------
#### [ CLP do Db2 ]

**Como se conectar ao servidor de banco de dados do Db2 usando Db2 CLP**

1. Para se conectar à instância do Db2 usando o Db2 CLP, você precisa do GSKit, que pode ser baixado no [IBM Fix Central](https://www.ibm.com/support/fixcentral/swg/selectFixes?parent=Security+Systems&product=ibm/Tivoli/IBM+Global+Security+Kit&release=All&platform=All&function=fixId&fixids=8.0.*&source=fc). Para usar o Db2 CLP, você também precisa do cliente IBM Db2, que pode ser baixado em [Download initial Version 11.5 clients and drivers](https://www.ibm.com/support/pages/download-initial-version-115-clients-and-drivers) no IBM Support.

1. Crie um armazenamento de chaves.

   ```
   gsk8capicmd_64 -keydb -create -db "directory/keystore-filename" -pw "changeThisPassword" -type pkcs12 -stash
   ```

1. Importe os pacotes de certificados assinado para o armazenamento de chaves.

   ```
   gsk8capicmd_64 -cert -import -file global-bundle.pem -target directory/keystore-filename> -target_stashed
   ```

1. Atualize a configuração da instância do Db2. 

   ```
   db2 update dbm cfg using SSL_CLNT_KEYDB keystore-filename SSL_CLNT_STASH keystore stash file immediate
   ```

1. Catalogue o nó e o banco de dados.

   ```
   db2 catalog tcpip node ssluse1 REMOTE endpoint SERVER ssl_svcename security ssl
   
   db2 catalog database testdb as ssltest at node ssluse1
   ```

1. Conecte-se ao banco de dados.

   ```
   db2 connect to ssltest user username using password
   ```

------