# provider-http/tls (HTTP Provider with TLS Certificates)

You can run this example with:

```bash
npx promptfoo@latest init --example provider-http/tls
cd provider-http/tls
```

This example demonstrates how to configure the HTTP provider with TLS/SSL certificates for mutual TLS (mTLS) authentication.

## Overview

The HTTP provider supports multiple certificate formats for mutual TLS authentication:

1. **PEM (Separate cert/key files)**: Traditional format with separate certificate and key files
2. **PEM with Encrypted Key**: PEM format where the private key is password-protected
3. **PFX/PKCS#12**: Combined certificate bundle format

Each format can be provided via:

- **File Path**: Reference files on disk
- **Inline Content**: Embed certificate content directly (base64 for binary formats)
- **Environment Variables**: Load from environment variables

## PEM Certificate Options

### Using Unencrypted PEM Files

The simplest approach - separate certificate and key files:

```yaml
tls:
  certPath: '/path/to/client-cert.pem'
  keyPath: '/path/to/client-key.pem'
```

### Using Encrypted PEM Private Key

When your private key is password-protected (starts with `BEGIN ENCRYPTED PRIVATE KEY`):

```yaml
tls:
  certPath: '/path/to/client-cert.pem'
  keyPath: '/path/to/client-key-encrypted.pem'
  passphrase: 'your-key-password'
```

### Using Inline PEM Content

Embed certificates directly in your configuration:

```yaml
tls:
  cert: |
    -----BEGIN CERTIFICATE-----
    MIIDxTCCAq2gAwIBAgIJAL...
    -----END CERTIFICATE-----
  key: |
    -----BEGIN PRIVATE KEY-----
    MIIEvQIBADANBgkqhkiG9w0B...
    -----END PRIVATE KEY-----
```

## PFX Certificate Options

### Using File Path

Reference a PFX file on the filesystem:

```yaml
tls:
  pfxPath: '/path/to/certificate.pfx'
  passphrase: 'your-passphrase'
```

### Using Inline Base64 Content

Embed the certificate directly in your configuration:

```yaml
tls:
  pfx: 'MIIJKQIBAzCCCO8GCSqGSIb3DQEHA...' # Base64-encoded PFX
  passphrase: 'your-passphrase'
```

### Using Environment Variables

Store sensitive certificates in environment variables:

```yaml
tls:
  pfx: '{{env.PFX_CERTIFICATE_BASE64}}'
  passphrase: '{{env.PFX_PASSPHRASE}}'
```

## Converting PFX to Base64

To use inline PFX certificates, you need to convert your PFX file to base64:

### Linux/Mac

```bash
base64 -i certificate.pfx -o certificate.b64
```

### Windows

```cmd
certutil -encode certificate.pfx certificate.b64
```

Then copy the content (excluding the BEGIN/END headers) to use as the `pfx` value.

## Security Considerations

1. **Never commit certificates to version control**: Use environment variables or external secret management
2. **Protect your private keys**: Ensure PFX files have appropriate file permissions
3. **Use strong passphrases**: Always protect PFX files with strong passphrases
4. **Certificate validation**: Keep `rejectUnauthorized: true` in production

## Running the Example

1. Replace the sample certificate values with your actual certificates
2. Set the required environment variables:
   ```bash
   export PFX_PASSPHRASE="your-passphrase"
   export PFX_CERTIFICATE_BASE64="your-base64-cert"
   ```
3. Run the evaluation:
   ```bash
   promptfoo eval
   ```

## TLS Configuration Options

| Option               | Description                                               |
| -------------------- | --------------------------------------------------------- |
| `cert`               | Inline PEM certificate content                            |
| `certPath`           | Path to PEM certificate file                              |
| `key`                | Inline PEM private key content                            |
| `keyPath`            | Path to PEM private key file                              |
| `pfx`                | Inline PFX certificate (base64-encoded string or Buffer)  |
| `pfxPath`            | Path to PFX file on disk                                  |
| `passphrase`         | Password for encrypted PEM private key or PFX certificate |
| `ca`                 | CA certificate content for server verification            |
| `caPath`             | Path to CA certificate file                               |
| `rejectUnauthorized` | Verify server certificates (always `true` in production)  |
| `minVersion`         | Minimum TLS version (e.g., 'TLSv1.2')                     |
| `maxVersion`         | Maximum TLS version (e.g., 'TLSv1.3')                     |
| `ciphers`            | Cipher suite specification                                |

## Troubleshooting

### Invalid PFX Format

If you get an error about invalid PFX format:

- Ensure the base64 encoding is correct
- Verify the passphrase is correct
- Check that the PFX file is not corrupted

### Connection Refused

If the connection is refused:

- Verify the server requires client certificates
- Ensure the certificate is valid and not expired
- Check that the certificate is trusted by the server

### Certificate Verification Failed

If certificate verification fails:

- Add the server's CA certificate using `ca` or `caPath`
- For development only: set `rejectUnauthorized: false` (never in production)

## Related Documentation

- [HTTP Provider Documentation](https://promptfoo.com/docs/providers/http)
- [TLS/HTTPS Configuration](https://promptfoo.com/docs/providers/http#tlshttps-configuration)
