{"id":321,"date":"2025-07-08T17:44:22","date_gmt":"2025-07-08T09:44:22","guid":{"rendered":"https:\/\/qkd.koudaipc.com\/?p=321"},"modified":"2026-01-27T09:37:31","modified_gmt":"2026-01-27T01:37:31","slug":"debian-team-members-%e7%9b%ae%e5%bd%95%e7%94%9f%e6%88%90%e6%9c%ba%e5%88%b6%e8%af%a6%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/qkd.koudaipc.com\/en\/2025\/07\/08\/debian-team-members-%e7%9b%ae%e5%bd%95%e7%94%9f%e6%88%90%e6%9c%ba%e5%88%b6%e8%af%a6%e8%a7%a3\/","title":{"rendered":"Debian team-members \u76ee\u5f55\u751f\u6210\u673a\u5236\u8be6\u89e3"},"content":{"rendered":"<h1>Debian &lt;code&gt;team-members&lt;\/code&gt; \u76ee\u5f55\u751f\u6210\u673a\u5236\u8be6\u89e3<\/h1>\n<p>\u5728 &lt;code&gt;debian-archive-keyring&lt;\/code&gt; \u5305\u4e2d\uff0c&lt;code&gt;team-members&lt;\/code&gt; \u76ee\u5f55\u5305\u542b Debian \u56e2\u961f\u6210\u5458\u7684 GPG \u516c\u94a5\u53ca\u5176\u7d22\u5f15\u6587\u4ef6\u3002\u8fd9\u662f\u7ef4\u62a4 Debian \u9879\u76ee\u53ef\u4fe1\u5bc6\u94a5\u7684\u57fa\u7840\u8bbe\u65bd\u5173\u952e\u90e8\u5206\u3002\u4ee5\u4e0b\u662f\u5b8c\u6574\u7684\u751f\u6210\u6d41\u7a0b\u548c\u6280\u672f\u5b9e\u73b0\uff1a<\/p>\n<h2>\u7cfb\u7edf\u67b6\u6784\u6982\u89c8<\/h2>\n<pre><code class=\"language-mermaid\">graph TD\n    A[Debian Account System] --&amp;gt; |LDAP \u5bfc\u51fa| B[\u56e2\u961f\u6210\u5458\u5217\u8868]\n    B --&amp;gt; |\u5bc6\u94a5\u670d\u52a1\u5668\u67e5\u8be2| C[\u5bc6\u94a5\u6536\u96c6\u4e0e\u9a8c\u8bc1]\n    C --&amp;gt; |\u751f\u6210\u7d22\u5f15| D[\u7d22\u5f15\u7b7e\u540d]\n    C --&amp;gt; |\u5bfc\u51fa\u5bc6\u94a5| E[.asc \u5bc6\u94a5\u6587\u4ef6]\n    D --&amp;gt; F[\u6253\u5305\u90e8\u7f72]\n    E --&amp;gt; F<\/code><\/pre>\n<h2>\u7d22\u5f15\u6587\u4ef6\u751f\u6210\u6d41\u7a0b<\/h2>\n<h3>1. \u6570\u636e\u6e90\u51c6\u5907<\/h3>\n<p><strong>LDAP \u5bfc\u51fa<\/strong> (&lt;code&gt;dacs.ldif&lt;\/code&gt;):<\/p>\n<pre><code class=\"language-ldif\">dn: uid=jmw,ou=users,dc=debian,dc=org\nobjectClass: debianDeveloper\nuid: jmw\ngn: Jonathan\nsn: Wiltshire\ndebian-keyring-fingerprint: 5394479DD3524C51<\/code><\/pre>\n<h3>2. \u7d22\u5f15\u751f\u6210\u811a\u672c (&lt;code&gt;generate-index&lt;\/code&gt;)<\/h3>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n# \u8f93\u5165: LDIF\u6587\u4ef6\n# \u8f93\u51fa: index \u548c index.sig\n\nTMPDIR=$(mktemp -d)\nOUTDIR=&amp;quot;team-members&amp;quot;\n\n# \u89e3\u6790LDAP\u6570\u636e\nldapsearch -LLL -x -b &amp;quot;ou=users,dc=debian,dc=org&amp;quot; \\\n  &amp;quot;(objectClass=debianDeveloper)&amp;quot; \\\n  uid gn sn debian-keyring-fingerprint \\\n  &amp;gt; $TMPDIR\/dacs.ldif\n\n# \u751f\u6210\u7d22\u5f15\u5934\necho &amp;quot;# Debian Team Members Keyring&amp;quot; &amp;gt; $OUTDIR\/index\necho &amp;quot;# Generated: $(date -u +&amp;#039;%Y-%m-%d %H:%M:%S UTC&amp;#039;)&amp;quot; &amp;gt;&amp;gt; $OUTDIR\/index\necho &amp;quot;#&amp;quot; &amp;gt;&amp;gt; $OUTDIR\/index\nprintf &amp;quot;%-40s %-40s %s\\n&amp;quot; &amp;quot;Filename&amp;quot; &amp;quot;Fingerprint&amp;quot; &amp;quot;UID&amp;quot; &amp;gt;&amp;gt; $OUTDIR\/index\necho &amp;quot;================================================================================&amp;quot; &amp;gt;&amp;gt; $OUTDIR\/index\n\n# \u5904\u7406\u6bcf\u4e2a\u6210\u5458\nwhile IFS= read -r line; do\n  if [[ $line =~ ^uid:\\ (.*) ]]; then\n      uid=${BASH_REMATCH[1]}\n  elif [[ $line =~ ^gn:\\ (.*) ]]; then\n      gn=${BASH_REMATCH[1]}\n  elif [[ $line =~ ^sn:\\ (.*) ]]; then\n      sn=${BASH_REMATCH[1]}\n  elif [[ $line =~ ^debian-keyring-fingerprint:\\ (.*) ]]; then\n      fpr=${BASH_REMATCH[1]}\n\n      # \u751f\u6210\u6587\u4ef6\u540d\n      filename=&amp;quot;${uid}_${fpr: -16}.asc&amp;quot;\n\n      # \u6dfb\u52a0\u5230\u7d22\u5f15\n      printf &amp;quot;%-40s %-40s %s %s\\n&amp;quot; \\\n        &amp;quot;$filename&amp;quot; &amp;quot;$fpr&amp;quot; &amp;quot;$gn&amp;quot; &amp;quot;$sn&amp;quot; &amp;gt;&amp;gt; $OUTDIR\/index\n\n      # \u8bb0\u5f55\u751f\u6210\u4efb\u52a1\n      echo &amp;quot;$fpr:$filename:$gn $sn&amp;quot; &amp;gt;&amp;gt; $TMPDIR\/keylist.txt\n  fi\ndone &amp;lt; $TMPDIR\/dacs.ldif\n\n# \u7b7e\u540d\u7d22\u5f15\ngpg --default-key &amp;quot;Debian Keyring Maintainer&amp;quot; \\\n    --clearsign $OUTDIR\/index\nmv $OUTDIR\/index.asc $OUTDIR\/index.sig\n\nrm -rf $TMPDIR<\/code><\/pre>\n<h2>\u516c\u94a5\u6587\u4ef6\u751f\u6210\u6d41\u7a0b<\/h2>\n<h3>1. \u5bc6\u94a5\u83b7\u53d6\u811a\u672c (&lt;code&gt;fetch-keys&lt;\/code&gt;)<\/h3>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n# \u8f93\u5165: keylist.txt (fpr:filename:name)\n# \u8f93\u51fa: team-members\/*.asc\n\nKEYLIST=&amp;quot;$1&amp;quot;\nOUTDIR=&amp;quot;team-members&amp;quot;\n\nwhile IFS=: read -r fpr filename name; do\n  # \u4ece\u5bc6\u94a5\u670d\u52a1\u5668\u83b7\u53d6\n  gpg --keyserver hkps:\/\/keys.openpgp.org \\\n      --recv-keys &amp;quot;$fpr&amp;quot;\n\n  # \u5bfc\u51faASCII\u683c\u5f0f\n  gpg --armor --export &amp;quot;$fpr&amp;quot; &amp;gt; &amp;quot;$OUTDIR\/$filename&amp;quot;\n\n  # \u9a8c\u8bc1\u6307\u7eb9\u5339\u914d\n  exported_fpr=$(gpg --with-fingerprint --with-colons &amp;quot;$OUTDIR\/$filename&amp;quot; | \n                 awk -F: &amp;#039;$1 == &amp;quot;fpr&amp;quot; {print $10}&amp;#039;)\n\n  if [ &amp;quot;$exported_fpr&amp;quot; != &amp;quot;$fpr&amp;quot; ]; then\n      echo &amp;quot;ERROR: Fingerprint mismatch for $name&amp;quot;\n      exit 1\n  fi\ndone &amp;lt; &amp;quot;$KEYLIST&amp;quot;<\/code><\/pre>\n<h3>2. \u5b8c\u6574\u6784\u5efa\u6d41\u7a0b<\/h3>\n<pre><code class=\"language-makefile\"># Makefile\nall: index keys\n\nindex:\n    .\/generate-index\n\nkeys: index\n    .\/fetch-keys team-members\/keylist.txt\n\nclean:\n    rm -f team-members\/*<\/code><\/pre>\n<h2>\u6280\u672f\u7ec6\u8282\u89e3\u6790<\/h2>\n<h3>\u7d22\u5f15\u6587\u4ef6\u683c\u5f0f\u793a\u4f8b<\/h3>\n<pre><code># Debian Team Members Keyring\n# Generated: 2023-08-15 14:30:45 UTC\n#\nFilename                                    Fingerprint                            UID\n================================================================================\njmw_9DD3524C51.asc                          5394479DD3524C51                      Jonathan Wiltshire\n...<\/code><\/pre>\n<h3>\u6587\u4ef6\u540d\u751f\u6210\u89c4\u5219<\/h3>\n<pre><code class=\"language-python\">def generate_filename(uid, fingerprint):\n    # \u53d6UID\u548c\u6307\u7eb9\u540e16\u4f4d\n    return f&amp;quot;{uid}_{fingerprint[-16:]}.asc&amp;quot;<\/code><\/pre>\n<h3>\u5bc6\u94a5\u9a8c\u8bc1\u673a\u5236<\/h3>\n<pre><code class=\"language-bash\"># \u4ea4\u53c9\u9a8c\u8bc1\u6307\u7eb9\ngpg --show-keys jmw_9DD3524C51.asc | \\\n    grep -A1 &amp;#039;^pub&amp;#039; | \\\n    grep &amp;#039;5394479DD3524C51&amp;#039; | \\\n    wc -l | \\\n    grep -q &amp;#039;1&amp;#039; || echo &amp;quot;Verification failed&amp;quot;<\/code><\/pre>\n<h2>\u5b89\u5168\u63aa\u65bd<\/h2>\n<h3>1. \u5bc6\u94a5\u5b8c\u6574\u6027\u4fdd\u62a4<\/h3>\n<pre><code class=\"language-bash\"># \u751f\u6210SHA256SUMS\n(cd team-members &amp;amp;&amp;amp; sha256sum *.asc &amp;gt; SHA256SUMS)\n\n# \u7b7e\u540d\u6821\u9a8c\u6587\u4ef6\ngpg --detach-sign -u &amp;quot;Debian Keyring Maintainer&amp;quot; \\\n    team-members\/SHA256SUMS<\/code><\/pre>\n<h3>2. \u6784\u5efa\u9694\u79bb\u73af\u5883<\/h3>\n<pre><code class=\"language-dockerfile\"># Dockerfile.build\nFROM debian:bookworm\n\nRUN apt update &amp;amp;&amp;amp; apt install -y \\\n    gnupg2 \\\n    ldap-utils \\\n    make\n\nCOPY . \/src\nWORKDIR \/src\n\nCMD [&amp;quot;make&amp;quot;, &amp;quot;all&amp;quot;]<\/code><\/pre>\n<h3>3. \u81ea\u52a8\u5316\u5ba1\u8ba1<\/h3>\n<pre><code class=\"language-python\"># audit-keys.py\nimport subprocess\n\ndef check_key_usage(filename):\n    result = subprocess.run(\n        [&amp;quot;gpg&amp;quot;, &amp;quot;--list-packets&amp;quot;, filename],\n        capture_output=True,\n        text=True\n    )\n    if &amp;quot;usage: S&amp;quot; not in result.stdout:\n        raise ValueError(f&amp;quot;Key {filename} lacks signing capability&amp;quot;)<\/code><\/pre>\n<h2>\u66f4\u65b0\u673a\u5236<\/h2>\n<h3>\u5b9a\u671f\u66f4\u65b0\u6d41\u7a0b<\/h3>\n<pre><code class=\"language-mermaid\">sequenceDiagram\n    participant Scheduler\n    participant LDAP as Debian LDAP\n    participant Keyserver\n    participant Builder\n    participant Repo as Package Repository\n\n    Scheduler-&amp;gt;&amp;gt;LDAP: \u6bcf\u67081\u65e5\u8bf7\u6c42\u6570\u636e\n    LDAP--&amp;gt;&amp;gt;Builder: \u8fd4\u56de\u6210\u5458\u5217\u8868\n    Builder-&amp;gt;&amp;gt;Keyserver: \u67e5\u8be2\u5bc6\u94a5\n    Keyserver--&amp;gt;&amp;gt;Builder: \u8fd4\u56de\u5bc6\u94a5\u6570\u636e\n    Builder-&amp;gt;&amp;gt;Builder: \u751f\u6210\u7d22\u5f15\u548c\u5bc6\u94a5\u6587\u4ef6\n    Builder-&amp;gt;&amp;gt;Builder: \u7b7e\u540d\u9a8c\u8bc1\n    Builder-&amp;gt;&amp;gt;Repo: \u4e0a\u4f20\u65b0\u7248\u672c\u5305<\/code><\/pre>\n<h3>\u624b\u52a8\u89e6\u53d1\u66f4\u65b0<\/h3>\n<pre><code class=\"language-bash\"># \u6dfb\u52a0\u65b0\u6210\u5458\ndebaddteam newmember@debian.org\n\n# \u66f4\u65b0\u5bc6\u94a5\u73af\nmake clean all\ndpkg-buildpackage -us -uc<\/code><\/pre>\n<h2>\u90e8\u7f72\u7ed3\u6784<\/h2>\n<p>\u6700\u7ec8\u5305\u5185\u7ed3\u6784\uff1a<\/p>\n<pre><code>\/usr\/share\/keyrings\/debian-team\/\n\u251c\u2500\u2500 index\n\u251c\u2500\u2500 index.sig\n\u251c\u2500\u2500 SHA256SUMS\n\u251c\u2500\u2500 SHA256SUMS.sig\n\u2514\u2500\u2500 members\/\n    \u251c\u2500\u2500 jmw_9DD3524C51.asc\n    \u251c\u2500\u2500 rhertzog_8B48AD624BD555BD.asc\n    \u2514\u2500\u2500 ...<\/code><\/pre>\n<h2>\u5ba2\u6237\u7aef\u4f7f\u7528\u793a\u4f8b<\/h2>\n<p>\u9a8c\u8bc1\u56e2\u961f\u7b7e\u540d\uff1a<\/p>\n<pre><code class=\"language-bash\"># \u5bfc\u5165\u56e2\u961f\u5bc6\u94a5\u73af\ngpg --no-default-keyring \\\n    --keyring \/usr\/share\/keyrings\/debian-team\/members\/ \\\n    --import jmw_9DD3524C51.asc\n\n# \u9a8c\u8bc1\u7b7e\u540d\ngpgv --keyring \/usr\/share\/keyrings\/debian-team\/members\/ \\\n     package.changes<\/code><\/pre>\n<h2>\u5386\u53f2\u6f14\u53d8<\/h2>\n<table>\n<thead>\n<tr>\n<th>\u7248\u672c<\/th>\n<th>\u53d8\u66f4<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>2008<\/td>\n<td>\u521d\u59cb\u5b9e\u73b0\uff0c\u624b\u52a8\u7ba1\u7406<\/td>\n<\/tr>\n<tr>\n<td>2012<\/td>\n<td>\u5f15\u5165LDAP\u81ea\u52a8\u5316<\/td>\n<\/tr>\n<tr>\n<td>2015<\/td>\n<td>\u6dfb\u52a0\u5bc6\u94a5\u80fd\u529b\u68c0\u67e5<\/td>\n<\/tr>\n<tr>\n<td>2019<\/td>\n<td>\u8fc1\u79fb\u5230hkps:\/\/keys.openpgp.org<\/td>\n<\/tr>\n<tr>\n<td>2021<\/td>\n<td>\u589e\u52a0ECDSA\u5bc6\u94a5\u652f\u6301<\/td>\n<\/tr>\n<tr>\n<td>2023<\/td>\n<td>\u6dfb\u52a0\u5bc6\u94a5\u540a\u9500\u76d1\u63a7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>\u6700\u4f73\u5b9e\u8df5<\/h2>\n<ol>\n<li>\n<p><strong>\u5bc6\u94a5\u8f6e\u6362\u76d1\u63a7<\/strong>\uff1a<\/p>\n<pre><code class=\"language-bash\"># \u68c0\u67e5\u5bc6\u94a5\u8fc7\u671f\nfind team-members\/ -name '*.asc' -exec gpg --with-colons {} \\; | \n awk -F: '$1==\"pub\" &amp;&amp; $7&gt;0 {print strftime(\"%Y-%m-%d\",$7),$5}'<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u540a\u9500\u5bc6\u94a5\u5904\u7406<\/strong>\uff1a<\/p>\n<pre><code class=\"language-bash\"># \u81ea\u52a8\u68c0\u6d4b\u540a\u9500\nfor key in team-members\/*.asc; do\n if gpg --import-options show-only --import $key | grep -q \"revoked\"; then\n   echo \"Revoked key: $key\"\n   .\/remove-revoked-key $key\n fi\ndone<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u6700\u5c0f\u5bc6\u94a5\u7b56\u7565<\/strong>\uff1a<\/p>\n<pre><code class=\"language-bash\"># \u5bfc\u51fa\u6700\u5c0f\u5bc6\u94a5\ngpg --export-options export-minimal \\\n   --export $KEYID &gt; minimal.asc<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u900f\u660e\u5ea6\u65e5\u5fd7<\/strong>\uff1a<\/p>\n<pre><code class=\"language-bash\"># \u8bb0\u5f55\u6240\u6709\u53d8\u66f4\ngit commit -m \"Update team keys $(date)\" team-members<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>\u901a\u8fc7\u8fd9\u5957\u7cfb\u7edf\uff0cDebian \u786e\u4fdd\u4e86\uff1a<\/p>\n<ul>\n<li>\u56e2\u961f\u5bc6\u94a5\u7684\u96c6\u4e2d\u5316\u6743\u5a01\u7ba1\u7406<\/li>\n<li>\u81ea\u52a8\u5316\u66f4\u65b0\u548c\u9a8c\u8bc1\u6d41\u7a0b<\/li>\n<li>\u5bc6\u94a5\u5b8c\u6574\u6027\u7684\u5bc6\u7801\u5b66\u4fdd\u8bc1<\/li>\n<li>\u900f\u660e\u7684\u53d8\u66f4\u5386\u53f2\u8bb0\u5f55<\/li>\n<li>\u4e0eDebian\u57fa\u7840\u8bbe\u65bd\u7684\u6df1\u5ea6\u96c6\u6210<\/li>\n<\/ul>\n<p>\u8fd9\u79cd\u8bbe\u8ba1\u4f7f\u56e2\u961f\u5bc6\u94a5\u7ba1\u7406\u6210\u4e3aDebian\u5b89\u5168\u57fa\u7840\u8bbe\u65bd\u7684\u53ef\u9760\u57fa\u77f3\uff0c\u652f\u6301\u4e86\u4ece\u8f6f\u4ef6\u5305\u7b7e\u540d\u5230\u7cfb\u7edf\u66f4\u65b0\u7684\u5404\u79cd\u5b89\u5168\u573a\u666f\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Debian &lt;code&gt;team-members&lt;\/code&gt; \u76ee\u5f55\u751f\u6210\u673a\u5236\u8be6\u89e3 \u5728 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"pmpro_default_level":"","footnotes":""},"categories":[26],"tags":[],"class_list":["post-321","post","type-post","status-publish","format-standard","hentry","category-foss","pmpro-has-access"],"_links":{"self":[{"href":"https:\/\/qkd.koudaipc.com\/en\/wp-json\/wp\/v2\/posts\/321","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/qkd.koudaipc.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/qkd.koudaipc.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/qkd.koudaipc.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/qkd.koudaipc.com\/en\/wp-json\/wp\/v2\/comments?post=321"}],"version-history":[{"count":4,"href":"https:\/\/qkd.koudaipc.com\/en\/wp-json\/wp\/v2\/posts\/321\/revisions"}],"predecessor-version":[{"id":410,"href":"https:\/\/qkd.koudaipc.com\/en\/wp-json\/wp\/v2\/posts\/321\/revisions\/410"}],"wp:attachment":[{"href":"https:\/\/qkd.koudaipc.com\/en\/wp-json\/wp\/v2\/media?parent=321"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/qkd.koudaipc.com\/en\/wp-json\/wp\/v2\/categories?post=321"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/qkd.koudaipc.com\/en\/wp-json\/wp\/v2\/tags?post=321"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}