ฉันใช้opendkim-genkey -b 2048 -t -s default -d mydomain.comส่งผลให้ไฟล์default.privateและdefault.txt. ใช่default.privateเริ่มต้น (ถูกต้อง SFAIK) ด้วย-----BEGIN RSA PRIVATE KEY-----และdefault.txtไม่เกิน 256 ตัวอักษรต่อเซ็กเมนต์ (ไม่ละเมิดข้อกำหนดการเข้ารหัส DNS) นอกจากนี้ยังไม่opendkim-testkeyส่งคืนสิ่งใด (ไม่มี-v) และมี-v -v -vข้อความแจ้งว่าKey not secure(แต่ฉันไม่ได้ใช้ DNSSEC) และKey OKดังนั้น กุญแจอย่างน้อยถูกต้องน้อยที่สุดตาม opendkim ต่อตัว

ฉันได้รับข้อผิดพลาด

Sep 26 22:41:49 mydomain opendkim[1793958]: 18R2fhko1843765: SSL error:0909006C:PEM routines:get_name:no start line
Sep 26 22:41:49 mydomain opendkim[1793958]: 18R2fhko1843765: dkim_eom(): resource unavailable: PEM_read_bio_PrivateKey() failed
Sep 26 22:41:49 mydomain sm-mta[1843765]: 18R2fhko1843765: milter=opendkim, reject=451 4.7.0 resource unavailable
Sep 26 22:41:49 mydomain sm-mta[1843765]: 18R2fhko1843765: Milter: data, reject=451 4.7.0 resource unavailable
Sep 26 22:41:49 mydomain sm-mta[1843765]: 18R2fhko1843765: to=<[email protected]>, delay=00:00:00, pri=30408, stat=resource unavailable

ฉันเคยเห็นการค้นหาเว็บอ้างอิงถึงทั้งข้อผิดพลาดSSL error:0909006C:PEM routines:get_name:no start lineและdkim_eom(): resource unavailable: PEM_read_bio_PrivateKey() failedแต่ไม่มีอะไรช่วย เมื่อฉันเห็น "กรณีปิด" เป็นเพราะข้อผิดพลาดในการใช้งานของผู้ใช้ เช่น สิทธิ์ใช้งานไม่ถูกต้อง ข้อกำหนดตำแหน่งไฟล์ไม่ถูกต้อง หรือการจัดรูปแบบคีย์/txt ไม่ถูกต้อง และผู้ส่งมักจะพูดว่า "ขออภัยสำหรับเสียงรบกวน" แต่ไม่มีสิ่งใดเลย กรณี. ฉันกำลังดำเนินการอย่างถูกต้องตามที่ระบุไว้ในเอกสาร โดยมีข้อผิดพลาดที่ฉันบันทึกไว้ด้านบน

สำหรับคนที่อยากรู้ ฉันใช้ Ubuntu 20.04 LTS และ sendmail 8.15.2 การร้องเรียนเกิดขึ้นจากรูทีนของ opendkim milter กับ SSL ดังนั้นบริบทภายนอกจึงไม่ควรมีความสำคัญ

ฉันจะถามในรายชื่อผู้รับจดหมาย opendkim แต่ "lists.opendkim.org" ไม่ทำงาน ฉันต้องทำให้ OpenDKIM ทำงานเพื่อที่จะเชื่อฟัง Master Goo (นอกจากจะเป็นแนวปฏิบัติที่ดีที่สุดแล้ว) ฉันจะขอบคุณถ้าใครก็ตามที่พบปัญหานี้โดยเฉพาะ และสามารถให้คำตอบที่ใช้งานได้

ผลลัพธ์ที่ฉันใช้นั้นตรงกับเอาต์พุต "opendkim-genkey" ไม่มีข้อผิดพลาดในการจัดรูปแบบตามที่อธิบายไว้ในที่อื่น และ opendkim-testkey นั้นใช้งานได้ดี ดังนั้นโปรดขอโทษที่ฉันไม่ได้รวมข้อมูลจริงนั้นไว้

ps: opendkim ติดตั้งด้วยapt install opendkim:

opendkim -p /var/run/opendkim.sock -V opendkim:
OpenDKIM Filter v2.11.0 Compiled with OpenSSL 1.1.1f 31 Mar 2020  
SMFI_VERSION 0x1000001  
libmilter version 1.0.1  
Supported signing algorithms: rsa-sha1 rsa-sha256 ed25519-sha256  
Supported canonicalization algorithms: relaxed simple  
Active code options: QUERY_CACHE USE_DB USE_LDAP USE_LUA USE_ODBX USE_UNBOUND _FFR_ATPS _FFR_RBL _FFR_REPLACE_RULES _FFR_SENDER_MACRO _FFR_STATS _FFR_VBR  
libopendkim 2.11.0: atps query_cache

ทั้งคีย์ที่สร้างโดยเครื่องมือ opendkim หรือคีย์ที่สร้างด้วยตนเอง (ตามเอกสารประกอบของ OpenDKIM) จะไม่ผ่านข้อผิดพลาด

answer

ฉันได้ตรวจสอบแล้วว่ารหัสนั้นถูกต้อง (ส่วนตัว<==>สาธารณะ) และสามารถเข้าถึงได้ด้วยสองวิธีที่แตกต่างกัน ฉันไม่ได้ใช้ KeyTable /etc/opendkim.conf ของฉัน (โดเมนจริงปลอมตัว) คือ:

Syslog          yes
UMask           007
Domain          mydomain.sometld
KeyFile         /etc/dkimkeys/10191.private
Selector        10191
Mode            v
Socket          inet:[email protected]
#@Socket        local:/run/opendkim/opendkim.sock
PidFile         /run/opendkim/opendkim.pid
OversignHeaders From
TrustAnchorFile /usr/share/dns/root.key
UserID          opendkim

ฉันเก็บตัวกรองไว้ในโหมด "v" เนื่องจาก "sv" ล้มเหลวตามที่ระบุ และฉันต้องรีสตาร์ทเครื่องรีดนมด้วย "sv" เพื่อทดสอบเท่านั้น การใช้ opendkim-2.10.3 ที่ได้รับจาก opendkim.org: ฉันได้แฮ็ก libopendkim/dkim.c ซึ่งใช้โดย milter เพื่อแสดงให้ฉันเห็น 96 ตัวอักษรแรก (*) ของคีย์ที่กำลังพยายาม เมื่อมันล้มเหลวในครั้งต่อไป (ในช่วงต้น เวลาเช้าเมื่อไม่มีใครสนใจ) (*) 96 = บรรทัดส่วนหัว + 'แถว' แรกของข้อมูลหลัก

1135         if (strncmp((char *) dkim->dkim_key, "-----", 5) == 0)
1136         {                                               /* PEM */
1137                 rsa->rsa_pkey = PEM_read_bio_PrivateKey(rsa->rsa_keydata, NULL,
1138                                                         NULL, NULL);
1139 
1140                 if (rsa->rsa_pkey == NULL)
1141                 {
1142                         dkim_load_ssl_errors(dkim, 0);
1143                         dkim_error(dkim, "PEM_read_bio_PrivateKey() failed");
1144                         // ecsd: we want to see what failed:
1145                         char dbuf[128]; sprintf(dbuf,"dkim_key %96.96s\n",dkim->dkim_key);
1146                         dkim_error(dkim, dbuf);
1147                         // end extra debug
1148                         BIO_free(rsa->rsa_keydata);
1149                         rsa->rsa_keydata = NULL;
1150                         return DKIM_STAT_NORESOURCE;
1151                 }
1152         }

ฉันควรจะดีบั๊ก PEM_read_bio_PrivateKey (เพื่อค้นหาว่ามันคืออะไร) แต่ก็ต้องทนกังวลกับการคอมไพล์ระบบย่อยใหม่ทั้งหมด นอกจากนี้ การร้องเรียนมีส่วนหัวที่ไม่ดี ดังนั้นฉันต้องเข้าใจสิ่งที่กำลังพยายาม "แทน" เนื่องจากเนื้อหาของคีย์ส่วนตัวนั้นถูกต้อง ในขณะเดียวกัน opendkim.org คืออะไรที่รายชื่ออีเมลของพวกเขาไม่ทำงาน และรายชื่อผู้ติดต่อที่ opendkim.org และ dkim.org ไม่ทำงาน เหมือนทุกคนเบื่อและกลับบ้าน ไม่เจ๋งสำหรับโปรโตคอลที่คุณต้องการนำไปใช้ในระดับสากล อย่างน้อยรหัสก็พยายาม แต่เช่นฉันต้องแฮ็ค "กำหนดค่า" เพื่อหยุดมันต้องใช้ห้องสมุดที่มี SSL_library_init() ซึ่งเอกสาร (โลกภายนอก) บอกว่าถูกมองข้าม (ดังนั้นรหัส opendkim จึงดูเหมือนจะไม่ได้รับการดูแลอย่างถูกต้อง )

configure:
16846 fi
16847 rm conftest.$ac_ext
16848 LIBS=$ac_func_search_save_LIBS
16849 fi
16850 #ecsd
16851 $as_echo "for libssl, LIBS:$LIBS"
16852 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_SSL_library_init" >&5
16853 $as_echo "$ac_cv_search_SSL_library_init" >&6; }
16854 ac_res=$ac_cv_search_SSL_library_init
16855 #ecsd:
16856 #if test "$ac_res" != no; then :
16857 #  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
16858 #else
16859 #  as_fn_error $? "libssl not found" "$LINENO" 5
16860 #fi
16861 
16862 
16863 
16864 fi

หวังว่านี่คือคำตอบ: ฉันพยายามรวบรวม OpenDKIM จากแหล่งที่มา แต่ไม่มีที่ไหนเลย: ข้อผิดพลาด PEM หายไป แต่ตัวกรองล้มเหลวในลักษณะอื่นที่ร้ายแรงต่อการใช้งาน ดังนั้นฉันจึงได้ "dk-filter" ซึ่งเป็นเวอร์ชันล่าสุดที่ล้าสมัย เนื่องจากใช้ SHA1 เท่านั้น เรียก "nofws" ที่ "รีแล็กซ์" เท่านั้น จัดการเพียงหนึ่ง canonicalization (ผ่อนคลายหรือเรียบง่าย เทียบกับสองอย่างใน 'ผ่อนคลาย/เรียบง่าย' และใช้ 'dns' แต่ไม่ใช่ 'dns/txt' ฉันแฮ็คมันตาม RFC8301 (ซึ่งไม่มีใครอ้างอิง) และอาจใช้งานได้ มันจัดการอีเมลขาเข้า และในที่สุดก็ให้ลายเซ็น DKIM แก่ฉัน:

DomainKey-Signature: a=rsa-sha256; s=10191; d=mydarneddomain.com; c=relaxed/simple; q=dns/txt;
    h=to:from:subject:message-id:date:user-agent:mime-version:
    content-type:content-transfer-encoding:content-language:x-uctc:x-sdmilter-detected;
    b=kldIuC9j/EIB7ouhRrhxmZBkC7xAazd8RiWHUA/1R0FZK265yeFgf+TPqbfTjErps
    CrkoCn1I2gdMpq8k9ZrdF8RsQk8FeZBVLGE9iY3D2Rkj/ozjdOyHgNaNDCHKfdnpiNp
    4uV/w7ZG8fAEdDwfSoQ3IBvCmxoszV2bzGvzKz+DuT17G8ES3aJcKsdm9+MEHz0VxrB
    EHdOd9ij/EBZFHTMwcLqBWVi+kTvUvzjFK1ssPEO9CHXIWqjBE1gKtfiIDkeJ7kx0w4
    ft8TiPvMb5Z1WyOPWoI6a+tNNz2at1URSYvxMcDi77m93GH5Tcda1fNN/shx9ze9Igw
    DwPHc6mFA==

เนื่องจากฉันแฮ็คสิ่งนี้ให้เป็นไปตามข้อกำหนดและการทำงาน (ยังไม่ได้รับการยืนยันในทางปฏิบัติ แต่อีกไม่นาน) และเนื่องจากอาจใช้งานได้กับทุกคนที่ OpenDKIM ไม่ทำงาน มันจึงคุ้มค่าที่จะแบ่งปันบน github พูด ฉันยังไม่รู้ว่าต้องทำอย่างไร ถ้ามีคนต้องการช่วยในเรื่องนั้น แจ้งให้เราทราบ

สิ่งนี้ดิบจริงๆ ไม่มีแม้แต่ไฟล์ "dk-filter.conf" แต่ต้องใช้บรรทัดคำสั่ง ฉันใช้

dk-filter -p inet:[email protected] -b sv -c relaxed -d mydarneddomain.com -D -h -H -l -S 10191 -s /etc/dkimkeys/10191.private

แม้ว่า -d สามารถอ้างถึงไฟล์ที่แสดงรายการโฮสต์ที่จะลงนาม (ยังไม่ได้ทดสอบ) และไม่ใช่ "บริการ" หากใครสามารถอ้างอิงหนังสือที่อธิบายวิธีการสรุปสำหรับเช่น Ubuntu เป็นบริการ แจ้งให้เราทราบ

PS: RFC8301 กำหนดค่าเฉพาะและห้ามใช้ SHA1 ไซต์ที่ตรวจสอบคีย์ DKIM อาจมีความคิดเห็นที่เก่าเกินไปว่าสามารถใช้ sha1 หรือ sha256 ได้ ตอนนี้สามารถใช้ sha256 ได้ไม่น้อยกว่า sha256 และความคิดเห็นเหล่านั้นล้าสมัย