Understanding DKIM Email Authentication
DKIM (DomainKeys Identified Mail) adds a digital signature to your outgoing emails. This proves they originated from your domain.
The cryptographic authentication helps receiving mail servers verify your emails haven't been tampered with during transmission. Gmail, Outlook, and Yahoo rely on DKIM signatures alongside SPF and DMARC records to determine inbox placement.
This tutorial shows you how to configure DKIM for email authentication using OpenDKIM on Ubuntu VPS running Postfix. You'll generate cryptographic keys, configure the DKIM daemon, integrate it with your mail server, and publish the necessary DNS records.
Prerequisites and Server Requirements
Before you begin, ensure your Ubuntu VPS meets these requirements:
- Ubuntu 22.04 LTS or newer with root access
- Postfix mail server already installed and configured
- Domain with DNS management access
- Valid MX records pointing to your server
You'll also need your domain's DNS zone accessible for adding TXT records. Most hosting control panels provide this functionality.
For optimal results, configure SPF records for email authentication before implementing DKIM. This layered approach provides comprehensive email security.
Installing OpenDKIM on Ubuntu VPS
OpenDKIM provides the core functionality for DKIM signing and verification. Install it along with the necessary tools:
sudo apt update
sudo apt install opendkim opendkim-tools
Create the OpenDKIM configuration directory and set proper ownership:
sudo mkdir -p /etc/opendkim/keys
sudo chown -R opendkim:opendkim /etc/opendkim
sudo chmod 700 /etc/opendkim/keys
The installation creates an opendkim user and group automatically. These will run the DKIM daemon with minimal privileges.
Generating DKIM Key Pairs
Generate a 2048-bit RSA key pair for your domain. Replace "yourdomain.com" with your actual domain:
sudo mkdir /etc/opendkim/keys/yourdomain.com
cd /etc/opendkim/keys/yourdomain.com
sudo opendkim-genkey -s default -d yourdomain.com
sudo chown opendkim:opendkim default.private default.txt
This creates two files. "default.private" contains your private key. "default.txt" contains the public key for DNS publication.
View the public key content:
sudo cat /etc/opendkim/keys/yourdomain.com/default.txt
The output shows a TXT record you'll add to your DNS zone. It looks similar to:
default._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..." )
Configuring OpenDKIM Settings
Create the main OpenDKIM configuration file:
sudo nano /etc/opendkim.conf
Add this configuration:
# Basic Settings
Autorestart Yes
AutorestartRate 10/1h
LogWhy Yes
Syslog Yes
SyslogSuccess Yes
Mode sv
CanonicalizeBodyLength 0
# Network Settings
Socket local:/var/spool/postfix/opendkim/opendkim.sock
PidFile /var/run/opendkim/opendkim.pid
# Security Settings
UMask 002
UserID opendkim:opendkim
TemporaryDirectory /var/tmp
# Signing Settings
KeyTable refile:/etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table
ExternalIgnoreList refile:/etc/opendkim/trusted.hosts
InternalHosts refile:/etc/opendkim/trusted.hosts
This configuration enables both signing outbound mail and verifying inbound DKIM signatures. The socket location integrates cleanly with Postfix's chroot environment.
Creating DKIM Configuration Tables
Create the key table that maps selectors to private keys:
sudo nano /etc/opendkim/key.table
Add your domain mapping:
default._domainkey.yourdomain.com yourdomain.com:default:/etc/opendkim/keys/yourdomain.com/default.private
Create the signing table for outbound mail:
sudo nano /etc/opendkim/signing.table
Map your domain to the key:
*@yourdomain.com default._domainkey.yourdomain.com
Create the trusted hosts file for internal networks:
sudo nano /etc/opendkim/trusted.hosts
Add trusted networks and domains:
127.0.0.1
::1
localhost
yourdomain.com
Set proper ownership for all configuration files:
sudo chown opendkim:opendkim /etc/opendkim/*
Integrating OpenDKIM with Postfix
Create the OpenDKIM socket directory inside Postfix's chroot:
sudo mkdir -p /var/spool/postfix/opendkim
sudo chown opendkim:postfix /var/spool/postfix/opendkim
Add the postfix user to the opendkim group:
sudo usermod -a -G opendkim postfix
Configure Postfix to use OpenDKIM by editing the main configuration:
sudo nano /etc/postfix/main.cf
Add these lines to integrate DKIM signing:
# DKIM Integration
milter_protocol = 2
milter_default_action = accept
smtpd_milters = local:/opendkim/opendkim.sock
non_smtpd_milters = local:/opendkim/opendkim.sock
This configuration enables DKIM processing for both SMTP submissions and local mail generation. Setting the default action to "accept" prevents mail delivery failures if OpenDKIM becomes temporarily unavailable.
For VPS environments handling multiple domains, consider our Postfix virtual domains setup guide for comprehensive multi-domain email hosting.
Publishing DKIM DNS Records
Extract the public key information from the generated file:
sudo cat /etc/opendkim/keys/yourdomain.com/default.txt
Create a TXT record in your DNS zone with these details:
- Record Name: default._domainkey
- Record Type: TXT
- Value: v=DKIM1; h=sha256; k=rsa; p=[your_public_key_string]
Remove any spaces and parentheses from the key string. The final TXT record should be one continuous line starting with "v=DKIM1".
DNS propagation typically takes 15 minutes to several hours. Use dig to verify the record:
dig TXT default._domainkey.yourdomain.com
You should see your DKIM public key in the response. Proper DNS configuration is crucial for email deliverability, especially when running VPS hosting for email services.
Starting and Testing DKIM Services
Start the OpenDKIM service and enable it for automatic startup:
sudo systemctl start opendkim
sudo systemctl enable opendkim
Check the service status:
sudo systemctl status opendkim
The service should show "active (running)" status. If there are errors, check the logs:
sudo journalctl -u opendkim -f
Restart Postfix to activate the milter integration:
sudo systemctl restart postfix
Verify Postfix connects to the OpenDKIM socket:
sudo netstat -nlp | grep opendkim
You should see the socket file listed in the output.
Verifying DKIM Implementation
Send a test email from your server to an external account you control. Many email clients show message headers where you can verify the DKIM signature.
Look for these headers in the received email:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=yourdomain.com; s=default;
Authentication-Results: gmail.com;
dkim=pass header.d=yourdomain.com
Use online DKIM testing tools like MX Toolbox or Mail Tester for comprehensive verification. These services analyze your email headers and provide detailed reports on DKIM validation.
Monitor your mail logs for DKIM-related entries:
sudo tail -f /var/log/mail.log | grep -i dkim
Successful DKIM signing appears as "DKIM-Signature" entries in your mail logs.
Troubleshooting Common DKIM Issues
Permission errors are the most frequent DKIM problems. Verify OpenDKIM can read its configuration:
sudo -u opendkim opendkim-testkey -d yourdomain.com -s default
This command tests key accessibility. Success returns "opendkim-testkey: key OK".
If Postfix can't connect to OpenDKIM, check socket permissions:
ls -la /var/spool/postfix/opendkim/
The socket should be owned by opendkim:postfix with appropriate group permissions.
DNS record formatting causes many validation failures. Ensure your TXT record contains no line breaks or extra spaces. The value should start with "v=DKIM1" and contain only the essential parameters.
Key rotation improves security. Generate new keys monthly or quarterly, update DNS records, then switch the configuration to use the new keys.
Advanced DKIM Configuration Options
For high-volume email servers, consider these performance optimizations:
Enable DKIM signature caching by adding to opendkim.conf:
QueryCache Yes
Configure multiple selectors for key rotation:
# In key.table
current._domainkey.yourdomain.com yourdomain.com:current:/etc/opendkim/keys/yourdomain.com/current.private
old._domainkey.yourdomain.com yourdomain.com:old:/etc/opendkim/keys/yourdomain.com/old.private
Set up DKIM for subdomain handling:
# In signing.table
*@mail.yourdomain.com current._domainkey.yourdomain.com
*@support.yourdomain.com current._domainkey.yourdomain.com
Monitor DKIM performance and email delivery through your VPS logs. Proper email configuration becomes especially important for business-critical applications requiring reliable delivery.
Ready to implement professional email hosting with DKIM authentication? Hostperl VPS hosting provides the performance and reliability needed for production email servers. Our New Zealand-based infrastructure ensures optimal deliverability for APAC regions, with full root access for custom DKIM configurations.
Frequently Asked Questions
How often should I rotate DKIM keys?
Security best practices recommend rotating DKIM keys every 6-12 months. Generate new keys, update DNS records, then switch your OpenDKIM configuration. Keep old keys published for 48 hours to handle delayed email processing.
Can I use the same DKIM key for multiple domains?
While technically possible, use separate DKIM keys for each domain. This approach limits security exposure and provides cleaner email authentication. Configure separate key directories and DNS records for each domain.
Why are my emails still going to spam after configuring DKIM?
DKIM alone doesn't guarantee inbox delivery. Implement SPF and DMARC records alongside DKIM for comprehensive email authentication. Monitor your sending reputation, maintain clean mailing lists, and ensure proper email content formatting.
What key size should I use for DKIM signatures?
Use 2048-bit RSA keys for optimal security and compatibility. While 1024-bit keys still work, many email providers now prefer or require 2048-bit keys. Avoid larger keys as they may cause DNS record size issues.
How do I verify DKIM is working correctly?
Send test emails to external accounts and check message headers for "DKIM-Signature" and "Authentication-Results" headers. Use online testing tools like MX Toolbox DKIM Lookup or send emails to check-auth@verifier.port25.com for automated verification reports.

