blob: ab3794eaa53566e7a3e72805cce1b4c5988f154b [file] [log] [blame]
EAP-TLS authentication support for PPP
======================================
1. Intro
The Extensible Authentication Protocol (EAP; RFC 3748) is a
security protocol that can be used with PPP. It provides a means
to plug in multiple optional authentication methods.
Transport Level Security (TLS; RFC 5216) provides for mutual
authentication, integrity-protected ciphersuite negotiation and
key exchange between two endpoints. It also provides for optional
MPPE encryption.
EAP-TLS (RFC 2716) incapsulates the TLS messages in EAP packets,
allowing TLS mutual authentication to be used as a generic EAP
mechanism. It also provides optional encryption using the MPPE
protocol.
This patch provide EAP-TLS support to pppd.
This authentication method can be used in both client or server
mode.
2. Building
To build pppd with EAP-TLS support, OpenSSL (http://www.openssl.org)
is required. Any version from 0.9.7 should work.
Configure, compile, and install as usual.
3. Configuration
On the client side there are two ways to configure EAP-TLS:
1. supply the appropriate 'ca', 'cert' and 'key' command-line parameters
2. edit the /etc/ppp/eaptls-client file.
Insert a line for each system with which you use EAP-TLS.
The line is composed of this fields separated by tab:
- Client name
The name used by the client for authentication, can be *
- Server name
The name of the server, can be *
- Client certificate file
The file containing the certificate chain for the
client in PEM format
- Server certificate file
If you want to specify the certificate that the
server is allowed to use, put the certificate file name.
Else put a dash '-'.
- CA certificate file
The file containing the trusted CA certificates in PEM
format.
- Client private key file
The file containing the client private key in PEM format.
On the server side edit the /etc/ppp/eaptls-server file.
Insert a line for each system with which you use EAP-TLS.
The line is composed of this fields separated by tab:
- Client name
The name used by the client for authentication, can be *
- Server name
The name of the server, can be *
- Client certificate file
If you want to specify the certificate that the
client is allowed to use, put the certificate file name.
Else put a dash '-'.
- Server certificate file
The file containing the certificate chain for the
server in PEM format
- CA certificate file
The file containing the trusted CA certificates in PEM format.
- Client private key file
The file containing the server private key in PEM format.
- addresses
A list of IP addresses the client is allowed to use.
OpenSSL engine support is included starting with v0.95 of this patch.
Currently the only engine tested is the 'pkcs11' engine (hardware token
support). To use the 'pksc11' engine:
- Use a special private key fileiname in the /etc/ppp/eaptls-client file:
<engine>:<identifier>
e.g.
pkcs11:123456
- The certificate can also be loaded from the 'pkcs11' engine using
a special client certificate filename in the /etc/ppp/eaptls-client file:
<engine>:<identifier>
e.g.
pkcs11:123456
- Create an /etc/ppp/openssl.cnf file to load the right OpenSSL engine prior
to starting 'pppd'. A sample openssl.cnf file is
openssl_conf = openssl_def
[ openssl_def ]
engines = engine_section
[ engine_section ]
pkcs11 = pkcs11_section
[ pkcs11_section ]
engine_id = pkcs11
dynamic_path = /usr/lib64/openssl/engines/engine_pkcs11.so
MODULE_PATH = /usr/lib64/libeTPkcs11.so
init = 0
- There are two ways to specify a password/PIN for the PKCS11 engine:
- inside the openssl.cnf file using
PIN = your-secret-pin
Note The keyword 'PIN' is case sensitive!
- Using the 'password' in the ppp options file.
From v0.97 of the eap-tls patch the password can also be supplied
using the appropriate 'eaptls_passwd_hook' (see plugins/passprompt.c
for an example).
4. Options
These pppd options are available:
ca <ca-file>
Use the CA public certificate found in <ca-file> in PEM format
ca-path <directory>
Use the directory <directory> as the CA public certificate directory
cert <cert-file>
Use the client public certificate found in <cert-file> in PEM format
or in engine:engine_id format
key <key-file>
Use the client private key found in <key-file> in PEM format
or in engine:engine_id format
crl <crl-file>
Use the Certificate Revocation List (CRL) file <crl-file> in PEM format.
crl-dir <dir>
Use CRL files from directory <dir>. It contains CRL files in PEM
format and each file contains a CRL. The files are looked up
by the issuer name hash value. Use the c_rehash utility
to create necessary links.
need-peer-eap
If the peer doesn't ask us to authenticate or doesn't use eap
to authenticate us, disconnect.
max-tls-version <1.0|1.1|1.2 (default)|1.3>
Specify the maximum TLS protocol version to negotiate with peers. Defaults
to TLSv1.2 as the TLSv1.3 code is experimental.
Note:
password-encrypted certificates can be used as of v0.94 of this
patch. The password for the eap-tls.key file is specified using
the regular
password ....
statement in the ppp options file, or by using the appropriate
plugin which supplies a 'eaptls_passwd_hook' routine.
5. Connecting
If you're setting up a pppd server, edit the EAP-TLS configuration file
as written above and then run pppd with the 'auth' option to authenticate
the client. The EAP-TLS method will be used if the other eap methods can't
be used (no secrets).
If you're setting up a client, edit the configuration file and then run
pppd with 'remotename' option to specify the server name. Add the
'need-peer-eap' option if you want to be sure the peer ask you to
authenticate (and to use eap) and to disconnect if it doesn't.
6. Example
The following example can be used to connect a Linux client with the 'pptp'
package to a Linux server running the 'pptpd' (PoPToP) package. The server
was configured with a certificate with name (CN) 'pptp-server', the client
was configured with a certificate with name (CN) 'pptp-client', both
signed by the same Certificate Authority (CA).
Server side:
- /etc/pptpd.conf file:
option /etc/ppp/options-pptpd-eaptls
localip 172.16.1.1
remoteip 172.16.1.10-20
- /etc/ppp/options-pptpd-eaptls file:
name pptp-server
lock
mtu 1500
mru 1450
auth
lcp-echo-failure 3
lcp-echo-interval 5
nodeflate
nobsdcomp
nopredictor1
nopcomp
noaccomp
require-eap
require-mppe-128
crl /home/janjust/ppp/keys/crl.pem
debug
logfile /tmp/pppd.log
- /etc/ppp/eaptls-server file:
* pptp-server - /etc/ppp/pptp-server.crt /etc/ppp/ca.crt /etc/ppp/pptp-server.key *
- On the server, run
pptdp --conf /etc/pptpd.conf
Client side:
- Run
pppd noauth require-eap require-mppe-128 \
ipcp-accept-local ipcp-accept-remote noipdefault \
cert /etc/ppp/keys/pptp-client.crt \
key /etc/ppp/keys/pptp-client.key \
ca /etc/ppp/keys/ca.crt \
name pptp-client remotename pptp-server \
debug logfile /tmp/pppd.log
pty "pptp pptp-server.example.com --nolaunchpppd"
Check /var/log/messages and the files /tmp/pppd.log on both sides for debugging info.
7. Notes
This is experimental code.
Send suggestions and comments to Jan Just Keijser <janjust@nikhef.nl>