[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: problem with isakmpd with certs
* Angelos D. Keromytis (angelos@cis.upenn.edu) [010105 20:36]:
> Err..you're supposed to copy your certificate to /etc/isakmpd/certs/,
> your private key to /tec/isakmpd/private/, and any CA certs to
> /etc/isakmpd/ca/
there was a typo: I wrote ca.ctr instead of ca.crt.
But there must be something else:
> >Why would it not find the public key? It is sitting in
> >/etc/isakmpd/private/lokal.key, like specified in the config file.
>
> It didn't find a public key for the *peer*, because no certificate was
> sent *by the peer*. One reason this may have happened is because you
> don't have the files in the correct directories, as outlined
> above. Another reason is because you may be using a different Phase 1
> ID in isakmpd from the one encoded in the certificate (via certpatch).
With more verbose debugging I found this:
215026.452546 Mesg 70 MSG_TYPE: INITIAL_CONTACT
215026.452675 Misc 30 ipsec_responder: phase 1 exchange 2 step 4
215156.767289 Misc 40 ike_phase_1_recv_ID: IPV4_ADDR:
215156.767430 Misc 40 c354b55b
215156.767593 Cryp 70 x509_hash_find: no certificate matched query
215156.770216 Misc 60 conf_get_str: configuration value not found [X509-certificates]:Accept-self-signed
215156.770640 Default rsa_sig_decode_hash: received CERT can't be validated
215156.770736 Default rsa_sig_decode_hash: no public key found
215156.770872 Default dropped message from 195.84.181.91 port 500 due to notification type INVALID_ID_INFORMATION
But now I do not understand what he wants. He looks for the certificat for
c354b55b, which (surprise!) matches the IP of my peer. So does he actually
look for the file /etc/isakmpd/certs/195.84.181.91.crt? I have only put the
certificate for my local machine there. Because I would create a certification
request for my local machine and get a certificate for my local machine, not
every one else, right?
Am I makeing a gross error here?
My script says precicely what happens; it does not change the configuration of
anything outside of the local directory (exept it generates a private key and
a ca.crt if it is not there allready), so it should be save to run.
But to know what I am doing it is not necessary to run it.
#!/bin/sh
# Done:
# switch to certificates
# add entries for firewalls, too
# Todo:
# add named.boot for nameservers
# ipfilter?
# ipnat?
#set -x
# takes two args: start and end value, start must be less then
# end
function SEQ {
N=$1
while [ "0" != $(( $N <= $2 )) ]
do
echo $N
let $((N++))
done
}
#SECRET=$(openssl rand 20 | hexdump -e '20/1 "%02x"')
I=0
while read NAME[$I] IP[$I] NET[$I] NETMASK[$I]
do
if echo ${NAME[$I]} | grep '^#' > /dev/null
then continue
fi
if [[ "" == ${NAME[$I]} ]]
then continue
fi
I=$(($I+1))
done < vpn.conf
I=$(($I-1))
# PKI and friends
# generate the CA first
(cat << 'EOF'
[ req ]
default_bits = 1024
distinguished_name = req_DN
[ req_DN ]
countryName = "Country Name"
countryName_value = $ENV::CERT_COUNTRY
localityName = "Locality Name"
localityName_value = $ENV::CERT_LOCALITY
organizationName = "Organisation"
organizationName_value = $ENV::CERT_ORG
commonName = "Common Name"
commonName_value = $ENV::CERT_CN
[ x509v3 ]
subjectAltName_value = $ENV::CERT_EMAIL
EOF
)> local_openssl.conf
# key and cert for the CA
export CERT_COUNTRY="se"
export CERT_LOCALITY="${NAME[0]}"
export CERT_ORG=Frontyard
export CERT_CN="${IP[0]}"
export CERT_EMAIL="root@utilator.com"
# this assumes the script runs on the CA-box if not, this has to be changed
while [ ! -s /etc/ssl/private/ca.key ]
do
rm -f /etc/ssl/private/ca.key
openssl genrsa -out /etc/ssl/private/ca.key 1024
done
openssl req -new -key /etc/ssl/private/ca.key \
-out /etc/ssl/private/ca.csr -config local_openssl.conf
openssl x509 -req -days 31 -in /etc/ssl/private/ca.csr \
-signkey /etc/ssl/private/ca.key -out /etc/ssl/ca.crt
# Main Loop
for LOCAL_HOST in $(SEQ 0 $I)
do
mkdir ${NAME[$LOCAL_HOST]}
# keys and certs for the peers
export CERT_COUNTRY="se"
export CERT_LOCALITY="${NAME[$LOCAL_HOST]}"
export CERT_ORG=Frontyard
export CERT_CN="${IP[$LOCAL_HOST]}"
export CERT_EMAIL="root@utilator.com"
while [ ! -s ${NAME[$LOCAL_HOST]}/local.key ]
do
rm -f ${NAME[$LOCAL_HOST]}/local.key
openssl genrsa -out ${NAME[$LOCAL_HOST]}/local.key 1024
done
chmod 600 ${NAME[$LOCAL_HOST]}/local.key
openssl req -new -key ${NAME[$LOCAL_HOST]}/local.key \
-out tmp.csr -config local_openssl.conf
openssl x509 -req -days 31 -in tmp.csr -CA /etc/ssl/ca.crt \
-CAkey /etc/ssl/private/ca.key -CAcreateserial \
-out ${NAME[$LOCAL_HOST]}/${IP[$LOCAL_HOST]}.crt
certpatch -i ${IP[$LOCAL_HOST]} -k /etc/ssl/private/ca.key \
${NAME[$LOCAL_HOST]}/${IP[$LOCAL_HOST]}.crt \
${NAME[$LOCAL_HOST]}/${IP[$LOCAL_HOST]}.crt
# isakmpd configuration
#######################
# isakmpd.conf
#######################
(cat << EOF
[General]
Retransmits= 5
Exchange-max-time= 120
Listen-on= ${IP[$LOCAL_HOST]}
[my-ID]
ID-type= IPV4_ADDR
Address= ${IP[$LOCAL_HOST]}
[Phase 1]
EOF
)> ${NAME[$LOCAL_HOST]}/isakmpd.conf
for REMOTE_HOST in $(SEQ 0 $I)
do
if [[ $LOCAL_HOST == $REMOTE_HOST ]]
then continue
fi
(cat << EOF
${IP[$REMOTE_HOST]}= ${NAME[$REMOTE_HOST]}
EOF
)>> ${NAME[$LOCAL_HOST]}/isakmpd.conf
done
(cat << EOF
[Phase 2]
EOF
)>> ${NAME[$LOCAL_HOST]}/isakmpd.conf
echo -n "Connections=" >> ${NAME[$LOCAL_HOST]}/isakmpd.conf
for REMOTE_HOST in $(SEQ 0 $I)
do
if [[ $LOCAL_HOST == $REMOTE_HOST ]]
then continue
fi
echo -n "incoming-from-${NAME[$REMOTE_HOST]}-net,incoming-from-${NAME[$REMOTE_HOST]}-host" \
>> ${NAME[$LOCAL_HOST]}/isakmpd.conf
if [[ ( $REMOTE_HOST < $I ) ]]
then if [[ ( $(($REMOTE_HOST + 1)) = $LOCAL_HOST) && ( $LOCAL_HOST = $I) ]]
then continue
else echo -n "," >> ${NAME[$LOCAL_HOST]}/isakmpd.conf
fi
fi
done
echo "" >> ${NAME[$LOCAL_HOST]}/isakmpd.conf
for REMOTE_HOST in $(SEQ 0 $I)
do
if [[ $LOCAL_HOST == $REMOTE_HOST ]]
then continue
fi
(cat << EOF
[${NAME[$REMOTE_HOST]}]
Phase= 1
Transport= udp
Address= ${IP[$REMOTE_HOST]}
Configuration= Default-main-mode
ID= my-ID
EOF
)>> ${NAME[$LOCAL_HOST]}/isakmpd.conf
done
for REMOTE_HOST in $(SEQ 0 $I)
do
if [[ $LOCAL_HOST == $REMOTE_HOST ]]
then continue
fi
(cat << EOF
[incoming-from-${NAME[$REMOTE_HOST]}-net]
Phase= 2
ISAKMP-peer= ${NAME[$REMOTE_HOST]}
Configuration= Default-quick-mode
Local-ID= ${NAME[$LOCAL_HOST]}-net
Remote-ID= ${NAME[$REMOTE_HOST]}-net
[incoming-from-${NAME[$REMOTE_HOST]}-host]
Phase= 2
ISAKMP-peer= ${NAME[$REMOTE_HOST]}
Configuration= Default-quick-mode
Local-ID= ${NAME[$LOCAL_HOST]}-host
Remote-ID= ${NAME[$REMOTE_HOST]}-host
EOF
)>> ${NAME[$LOCAL_HOST]}/isakmpd.conf
done
for HOST in $(SEQ 0 $I)
do
(cat << EOF
[${NAME[$HOST]}-net]
ID-type= IPV4_ADDR_SUBNET
Network= ${NET[$HOST]}
Netmask= ${NETMASK[$HOST]}
[${NAME[$HOST]}-host]
ID-type= IPV4_ADDR
Address= ${IP[$HOST]}
EOF
)>> ${NAME[$LOCAL_HOST]}/isakmpd.conf
done
done
for HOST in $(SEQ 0 $I)
do
(cat << EOF
[Default-main-mode]
DOI= IPSEC
EXCHANGE_TYPE= ID_PROT
Transforms= 3DES-MD5
[X509-certificates]
CA-directory= /etc/isakmpd/ca/
Cert-directory= /etc/isakmpd/certs/
Private-key= /etc/isakmpd/private/local.key
[3DES-MD5]
ENCRYPTION_ALGORITHM= 3DES_CBC
HASH_ALGORITHM= MD5
AUTHENTICATION_METHOD= RSA_SIG
GROUP_DESCRIPTION= MODP_1024
Life= LIFE_60_SECS,LIFE_1000_KB
[Default-quick-mode]
DOI= IPSEC
EXCHANGE_TYPE= QUICK_MODE
Suites= QM-ESP-3DES-MD5-PFS-SUITE
[QM-ESP-3DES-MD5-PFS-SUITE]
Protocols= QM-ESP-3DES-MD5-PFS
[QM-ESP-3DES-MD5-PFS]
PROTOCOL_ID= IPSEC_ESP
Transforms= QM-ESP-3DES-MD5-PFS-XF
[QM-ESP-3DES-MD5-PFS-XF]
TRANSFORM_ID= 3DES
ENCAPSULATION_MODE= TUNNEL
AUTHENTICATION_ALGORITHM= HMAC_MD5
GROUP_DESCRIPTION= MODP_1024
Life= LIFE_60_SECS
[LIFE_60_SECS]
LIFE_TYPE= SECONDS
LIFE_DURATION= 60,45:72
[LIFE_1000_KB]
LIFE_TYPE= KILOBYTES
LIFE_DURATION= 1000,768:1536
EOF
)>> ${NAME[$HOST]}/isakmpd.conf
chmod 600 ${NAME[$HOST]}/isakmpd.conf
done
rm local_openssl.conf tmp.csr # clean up
for HOST in $(SEQ 0 $I)
do
(cat << EOF
keynote-version: 2
Authorizer: "POLICY"
licensees: "DN:\ORG=Frontyard"
Conditions: app_domain == "IPsec policy" &&
esp_present == "yes" &&
esp_enc_alg != "null" -> "true";
EOF
)> ${NAME[$HOST]}/isakmpd.policy
chmod 600 ${NAME[$HOST]}/isakmpd.policy
done
for HOST in $(SEQ 0 $I)
do
(cat << EOF
#!/bin/sh
scp isakmpd.conf root@${IP[$HOST]}:/etc/isakmpd/
scp isakmpd.policy root@${IP[$HOST]}:/etc/isakmpd/
scp ${IP[$HOST]}.crt root@${IP[$HOST]}:/etc/isakmpd/certs/
scp local.key root@${IP[$HOST]}:/etc/isakmpd/private/
scp /etc/ssl/ca.crt root@${IP[$HOST]}:/etc/isakmpd/ca/
EOF
)> ${NAME[$HOST]}/put
chmod 700 ${NAME[$HOST]}/put
(
cd ${NAME[$HOST]}
./put
)
done
#general_name, IP_Address, privat_NET
# the host that should be the CA goes in the first line!
utilator 195.84.181.91 10.0.1.0 255.255.255.0
schuldei 195.84.105.112 192.168.1.0 255.255.255.0
#frontyard 212.181.69.225 192.168.1.0 255.255.255.0