# Proč při připojení k SMTP dostávám chyby TLS?

> Opravte chyby handshaku SSL a TLS se smtp.emailit.com, například „wrong version number“, nesoulad názvu v certifikátu a selhání STARTTLS.

Tento článek se zabývá chybami, ke kterým dochází, když váš klient a SMTP relay Emailitu navazují šifrování. Téměř vždy je způsobuje nesoulad mezi portem a režimem TLS ve vašem klientovi.

## Příznaky

- `SSL routines:ssl3_get_record:wrong version number` nebo `ERR_SSL_WRONG_VERSION_NUMBER`
- `Hostname/IP does not match certificate's altnames` nebo `certificate verify failed`
- `STARTTLS failed`, `Greeting never received` nebo se spojení po připojení zasekne
- `unsupported protocol` nebo `no protocols available`

## Příčina

Emailit používá dva režimy TLS a každý port očekává jeden z nich:

| Port | Režim | Typické nastavení klienta |
| --- | --- | --- |
| 587, 2525, 2587, 25 | **STARTTLS**: relace začíná v prostém textu a pak se přepne na šifrovanou | Nodemailer `secure: false`, PHPMailer `ENCRYPTION_STARTTLS`, „TLS“ ve většině rozhraní |
| 465 | **Implicitní TLS**: šifrováno od prvního bajtu | Nodemailer `secure: true`, PHPMailer `ENCRYPTION_SMTPS`, „SSL“ ve většině rozhraní |

Časté příčiny jsou:

- **Implicitní TLS na portu pro STARTTLS**, například `secure: true` s portem 587. Klient očekává handshake TLS, ale dostane uvítání v prostém textu, a výsledkem je „wrong version number“.
- **STARTTLS na portu 465.** Klient čeká na uvítání, které server v nešifrované podobě nikdy nepošle, takže se spojení zasekne.
- **Připojení přes IP adresu nebo přes vlastní CNAME.** Certifikát je vystavený pro `smtp.emailit.com`, takže jakýkoli jiný název hostitele ověřením neprojde.
- **Stará implementace TLS.** Relay vyjednává TLS 1.2 nebo TLS 1.3. Klienti omezení na TLS 1.0 nebo 1.1 nebo se zastaralou sadou certifikátů CA handshake nedokončí.
- **Kontrola provozu.** Některé antiviry a firemní proxy zachytávají SMTP a předkládají vlastní certifikát.

## Řešení

1. **Sladťe port s režimem.** Použijte port `587` se STARTTLS, nebo port `465` s implicitním TLS. Nekombinujte je.

```javascript title="mailer.js"
const transporter = nodemailer.createTransport({
  host: 'smtp.emailit.com',
  port: 587,
  secure: false,     // STARTTLS on 587; set true only for port 465
  requireTLS: true,  // refuse to send if the upgrade fails
  auth: { user: 'emailit', pass: process.env.EMAILIT_API_KEY },
});
```

2. **Použijte přesný název hostitele.** Nastavte hostitele na `smtp.emailit.com`. Nepoužívejte IP adresu ani alias.

3. **Vyžadujte v klientovi šifrování.** STARTTLS se nabízí na každém portu s prostým textem, ale relay ho nevynucuje. Zapněte v klientovi volbu „require TLS“, aby se přístupové údaje nikdy neposílaly nešifrovaně.

4. **Otestujte handshake ze stroje, který odesílá.**

```bash
openssl s_client -starttls smtp -connect smtp.emailit.com:587 -servername smtp.emailit.com
openssl s_client -connect smtp.emailit.com:465 -servername smtp.emailit.com
```

   Správný výsledek ukazuje `subject=CN=smtp.emailit.com` a `Verify return code: 0 (ok)`. Jiný subjekt znamená, že spojení ve vaší síti něco zachytává.

5. **Aktualizujte staré běhové prostředí.** Pokud váš klient nedokáže vyjednat TLS 1.2, aktualizujte běhové prostředí jazyka nebo OpenSSL a systémové certifikáty CA.

Pokud handshake uspěje, ale přihlášení selže, přečtěte si článek [Proč SMTP vrací 535 Authentication failed?](/cs/docs/kb/smtp-535-authentication-failed/) Pokud se nemůžete připojit vůbec, přečtěte si článek [Proč vyprší časový limit připojení k SMTP?](/cs/docs/kb/smtp-connection-timeout-port-25/)

## Stále si nevíte rady?

[Napište podpoře](/contact/) nebo se zeptejte na [Discordu](https://discord.emailit.com). Uveďte port, klientskou knihovnu a její verzi a výstup příkazu `openssl s_client`.

---
Zdroj: https://emailit.com/cs/docs/kb/smtp-tls-errors/
