<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Building a custom extension in an isolated network in Custom Solutions Spotlight</title>
    <link>https://community.dynatrace.com/t5/Custom-Solutions-Spotlight/Building-a-custom-extension-in-an-isolated-network/m-p/283714#M206</link>
    <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;Here my how-to build a custom extension in a place without internet access, which is my case:&lt;/P&gt;&lt;P&gt;&lt;FONT size="6"&gt;References&lt;/FONT&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;A href="https://docs.dynatrace.com/docs/ingest-from/extensions20/extensions-concepts" target="_blank" rel="noopener"&gt;https://docs.dynatrace.com/docs/ingest-from/extensions20/extensions-concepts&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://docs.dynatrace.com/docs/ingest-from/extensions20/sign-extension" target="_blank" rel="noopener"&gt;https://docs.dynatrace.com/docs/ingest-from/extensions20/sign-extension&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://community.dynatrace.com/t5/Extensions/Dynatrace-2-0-Extension-ActivationSchema/m-p/257483" target="_blank" rel="noopener"&gt;https://community.dynatrace.com/t5/Extensions/Dynatrace-2-0-Extension-ActivationSchema/m-p/257483&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;&lt;A href="https://developer.dynatrace.com/develop/dynatrace-extensions-vscode/guides/create_extension" target="_blank" rel="noopener"&gt;https://developer.dynatrace.com/develop/dynatrace-extensions-vscode/guides/create_extension&lt;/A&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://dynatrace-extensions.github.io/dt-extensions-python-sdk/" target="_blank" rel="noopener"&gt;https://dynatrace-extensions.github.io/dt-extensions-python-sdk/&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;&lt;A href="https://dynatrace-extensions.github.io/dt-extensions-python-sdk/index.html" target="_blank" rel="noopener"&gt;https://dynatrace-extensions.github.io/dt-extensions-python-sdk/index.html&lt;/A&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://dynatrace-extensions.github.io/dt-extensions-python-sdk/guides/extension_structure.html" target="_blank" rel="noopener"&gt;https://dynatrace-extensions.github.io/dt-extensions-python-sdk/guides/extension_structure.html&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;&lt;A href="https://dynatrace-extensions.github.io/dt-extensions-python-sdk/api/extension.html" target="_blank" rel="noopener"&gt;https://dynatrace-extensions.github.io/dt-extensions-python-sdk/api/extension.html&lt;/A&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://github.com/dynatrace-oss/dt-cli" target="_blank" rel="noopener"&gt;https://github.com/dynatrace-oss/dt-cli&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;&lt;A href="https://www.python.org/downloads/source/" target="_blank" rel="noopener"&gt;https://www.python.org/downloads/source/&lt;/A&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://github.com/python/cpython.git" target="_blank" rel="noopener"&gt;https://github.com/python/cpython.git&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;&lt;A href="https://pip.pypa.io/en/stable/cli/pip_install/" target="_blank" rel="noopener"&gt;pip install - pip documentation v25.2&lt;/A&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="6"&gt;Prerequisites&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size="5"&gt;Python distribution&lt;/FONT&gt;&lt;/P&gt;&lt;P class=""&gt;The Python version must be the same than the one used by the ActiveGates: &lt;STRONG&gt;Python 3.10.15&lt;/STRONG&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;&amp;nbsp;./remotepluginmodule/agent/res/dsruntime/python3.10/bin/python3 --version&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Python 3.10.15&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Download the required Python source from&amp;nbsp;&lt;A href="https://github.com/python/cpython.git" target="_blank" rel="noopener"&gt;https://github.com/python/cpython.git&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;Compile it:&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;cd cpython&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;./configure --prefix=&amp;lt;path to your new Python&amp;gt; \&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --with-ensurepip=install&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;make -j$((`nproc`+1))&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;make install&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;&amp;lt;path to your new Python&amp;gt;/bin/python3 –version&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Python 3.10.15&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Now we need the Python packages. Download dt-cli and dt-extensions-sdk packages (see in the ref for where to download from) to be able to build your own extension. Download extra required extensions from the pypi web site.&lt;/P&gt;&lt;P&gt;Move the packages in a dedicated folder on your isolated machine.&lt;/P&gt;&lt;P&gt;Now, install the packages:&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;dnf install -y&amp;nbsp;rust rust-toolset rust-srpm-macros libffi-devel&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;export PATH="&amp;lt;path to your new Python&amp;gt;/bin:${PATH}"&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;cd &amp;lt;path to your local package repo&amp;gt;&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;pip3 install --no-index --find-links=&amp;lt;path to your local package repo&amp;gt; &amp;lt;package name&amp;gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;dt-sdk --help&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;Usage: dt-sdk [OPTIONS] COMMAND [ARGS]&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;...&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;dt --help&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;Usage: dt [OPTIONS] COMMAND [ARGS]...&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;...&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="5"&gt;Signature&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;Extensions require to be signed with a certificate. This certificate must be present in the cluster and in targets (ActiveGate for remote extension, OneAgent for local extension). The extension is checked against the certificate before being executed, to prevent any intrusion of malicious code.&lt;/P&gt;&lt;P&gt;Generation of the certificate on your development machine:&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;cd &amp;lt;path to your certificate&amp;gt;&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;dt extension genca --no-ca-passphrase&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Generating CA...&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Wrote CA private key: ./ca.key&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Wrote CA certificate: ./ca.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;mv ca.pem custom_extension_ca.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;mv ./ca.key custom_extension_ca.key&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;dt extension generate-developer-pem -o custom_extension_developer.pem --ca-crt custom_extension_ca.pem --ca-key custom_extension_ca.key --name DXC&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Loading CA private key custom_extension_ca.key&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Loading CA certificate custom_extension_ca.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Generating developer certificate...&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Wrote developer certificate: custom_extension_developer.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Wrote developer private key: custom_extension_developer.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE border="1" width="64.00201630425336%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="33.333333333333336%" height="57px"&gt;&lt;STRONG&gt;Kind of target&amp;nbsp;&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD width="33.333333333333336%" height="57px"&gt;&lt;STRONG&gt;Place&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="33.333333333333336%" height="30px"&gt;Cluster&lt;/TD&gt;&lt;TD width="33.333333333333336%" height="30px"&gt;Put the&amp;nbsp;custom_extension_ca.pem in&amp;nbsp;GUI =&amp;gt; Credential vault&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="33.333333333333336%" height="30px"&gt;ActiveGate&lt;/TD&gt;&lt;TD width="33.333333333333336%" height="30px"&gt;./remotepluginmodule/agent/conf/certificates/custom_extension_ca.pem&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="33.333333333333336%" height="77px"&gt;UNIX OneAgent&lt;/TD&gt;&lt;TD width="33.333333333333336%" height="77px"&gt;&lt;P class=""&gt;/var/lib/dynatrace/oneagent/agent/config/certificates&lt;/P&gt;&lt;P class=""&gt;Beware: the folder is own by root&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD height="57px"&gt;Windows OneAgent&lt;/TD&gt;&lt;TD height="57px"&gt;&lt;P class=""&gt;/project/eag0/config/remotepluginmodule/agent/conf/certificates&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="6"&gt;Extension build&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;After developing your extension according the documentation&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;A href="https://dynatrace-extensions.github.io/dt-extensions-python-sdk/" target="_blank" rel="noopener"&gt;https://dynatrace-extensions.github.io/dt-extensions-python-sdk/&lt;/A&gt;&lt;/P&gt;&lt;P&gt;You need to compile&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;export&amp;nbsp;PIP_NO_INDEX=1&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;export PATH="&amp;lt;path to your new Python&amp;gt;/bin:${PATH}"&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;cd &amp;lt;path to your custom extension&amp;gt;&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;dt-sdk build --find-links=&amp;lt;path to your local package repo&amp;gt; --private-key&amp;nbsp; &amp;lt;path to your certificate&amp;gt;/custom_extension_developer.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Gautier&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Wed, 13 Aug 2025 08:34:03 GMT</pubDate>
    <dc:creator>gautier_begin</dc:creator>
    <dc:date>2025-08-13T08:34:03Z</dc:date>
    <item>
      <title>Building a custom extension in an isolated network</title>
      <link>https://community.dynatrace.com/t5/Custom-Solutions-Spotlight/Building-a-custom-extension-in-an-isolated-network/m-p/283714#M206</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;Here my how-to build a custom extension in a place without internet access, which is my case:&lt;/P&gt;&lt;P&gt;&lt;FONT size="6"&gt;References&lt;/FONT&gt;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;&lt;A href="https://docs.dynatrace.com/docs/ingest-from/extensions20/extensions-concepts" target="_blank" rel="noopener"&gt;https://docs.dynatrace.com/docs/ingest-from/extensions20/extensions-concepts&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://docs.dynatrace.com/docs/ingest-from/extensions20/sign-extension" target="_blank" rel="noopener"&gt;https://docs.dynatrace.com/docs/ingest-from/extensions20/sign-extension&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://community.dynatrace.com/t5/Extensions/Dynatrace-2-0-Extension-ActivationSchema/m-p/257483" target="_blank" rel="noopener"&gt;https://community.dynatrace.com/t5/Extensions/Dynatrace-2-0-Extension-ActivationSchema/m-p/257483&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;&lt;A href="https://developer.dynatrace.com/develop/dynatrace-extensions-vscode/guides/create_extension" target="_blank" rel="noopener"&gt;https://developer.dynatrace.com/develop/dynatrace-extensions-vscode/guides/create_extension&lt;/A&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://dynatrace-extensions.github.io/dt-extensions-python-sdk/" target="_blank" rel="noopener"&gt;https://dynatrace-extensions.github.io/dt-extensions-python-sdk/&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;&lt;A href="https://dynatrace-extensions.github.io/dt-extensions-python-sdk/index.html" target="_blank" rel="noopener"&gt;https://dynatrace-extensions.github.io/dt-extensions-python-sdk/index.html&lt;/A&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://dynatrace-extensions.github.io/dt-extensions-python-sdk/guides/extension_structure.html" target="_blank" rel="noopener"&gt;https://dynatrace-extensions.github.io/dt-extensions-python-sdk/guides/extension_structure.html&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;&lt;A href="https://dynatrace-extensions.github.io/dt-extensions-python-sdk/api/extension.html" target="_blank" rel="noopener"&gt;https://dynatrace-extensions.github.io/dt-extensions-python-sdk/api/extension.html&lt;/A&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://github.com/dynatrace-oss/dt-cli" target="_blank" rel="noopener"&gt;https://github.com/dynatrace-oss/dt-cli&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;&lt;A href="https://www.python.org/downloads/source/" target="_blank" rel="noopener"&gt;https://www.python.org/downloads/source/&lt;/A&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;&lt;LI&gt;&lt;A href="https://github.com/python/cpython.git" target="_blank" rel="noopener"&gt;https://github.com/python/cpython.git&lt;/A&gt;&lt;/LI&gt;&lt;LI&gt;&lt;SPAN&gt;&lt;A href="https://pip.pypa.io/en/stable/cli/pip_install/" target="_blank" rel="noopener"&gt;pip install - pip documentation v25.2&lt;/A&gt;&lt;/SPAN&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="6"&gt;Prerequisites&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size="5"&gt;Python distribution&lt;/FONT&gt;&lt;/P&gt;&lt;P class=""&gt;The Python version must be the same than the one used by the ActiveGates: &lt;STRONG&gt;Python 3.10.15&lt;/STRONG&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;&amp;nbsp;./remotepluginmodule/agent/res/dsruntime/python3.10/bin/python3 --version&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Python 3.10.15&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Download the required Python source from&amp;nbsp;&lt;A href="https://github.com/python/cpython.git" target="_blank" rel="noopener"&gt;https://github.com/python/cpython.git&lt;/A&gt;.&lt;/P&gt;&lt;P&gt;Compile it:&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;cd cpython&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;./configure --prefix=&amp;lt;path to your new Python&amp;gt; \&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --with-ensurepip=install&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;make -j$((`nproc`+1))&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;make install&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;&amp;lt;path to your new Python&amp;gt;/bin/python3 –version&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Python 3.10.15&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Now we need the Python packages. Download dt-cli and dt-extensions-sdk packages (see in the ref for where to download from) to be able to build your own extension. Download extra required extensions from the pypi web site.&lt;/P&gt;&lt;P&gt;Move the packages in a dedicated folder on your isolated machine.&lt;/P&gt;&lt;P&gt;Now, install the packages:&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;dnf install -y&amp;nbsp;rust rust-toolset rust-srpm-macros libffi-devel&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;export PATH="&amp;lt;path to your new Python&amp;gt;/bin:${PATH}"&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;cd &amp;lt;path to your local package repo&amp;gt;&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;pip3 install --no-index --find-links=&amp;lt;path to your local package repo&amp;gt; &amp;lt;package name&amp;gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;dt-sdk --help&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;Usage: dt-sdk [OPTIONS] COMMAND [ARGS]&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;...&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;dt --help&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;Usage: dt [OPTIONS] COMMAND [ARGS]...&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;...&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="5"&gt;Signature&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;Extensions require to be signed with a certificate. This certificate must be present in the cluster and in targets (ActiveGate for remote extension, OneAgent for local extension). The extension is checked against the certificate before being executed, to prevent any intrusion of malicious code.&lt;/P&gt;&lt;P&gt;Generation of the certificate on your development machine:&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;cd &amp;lt;path to your certificate&amp;gt;&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;dt extension genca --no-ca-passphrase&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Generating CA...&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Wrote CA private key: ./ca.key&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Wrote CA certificate: ./ca.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;mv ca.pem custom_extension_ca.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;mv ./ca.key custom_extension_ca.key&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;dt extension generate-developer-pem -o custom_extension_developer.pem --ca-crt custom_extension_ca.pem --ca-key custom_extension_ca.key --name DXC&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Loading CA private key custom_extension_ca.key&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Loading CA certificate custom_extension_ca.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Generating developer certificate...&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Wrote developer certificate: custom_extension_developer.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&lt;EM&gt;Wrote developer private key: custom_extension_developer.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE border="1" width="64.00201630425336%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="33.333333333333336%" height="57px"&gt;&lt;STRONG&gt;Kind of target&amp;nbsp;&lt;/STRONG&gt;&lt;/TD&gt;&lt;TD width="33.333333333333336%" height="57px"&gt;&lt;STRONG&gt;Place&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="33.333333333333336%" height="30px"&gt;Cluster&lt;/TD&gt;&lt;TD width="33.333333333333336%" height="30px"&gt;Put the&amp;nbsp;custom_extension_ca.pem in&amp;nbsp;GUI =&amp;gt; Credential vault&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="33.333333333333336%" height="30px"&gt;ActiveGate&lt;/TD&gt;&lt;TD width="33.333333333333336%" height="30px"&gt;./remotepluginmodule/agent/conf/certificates/custom_extension_ca.pem&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="33.333333333333336%" height="77px"&gt;UNIX OneAgent&lt;/TD&gt;&lt;TD width="33.333333333333336%" height="77px"&gt;&lt;P class=""&gt;/var/lib/dynatrace/oneagent/agent/config/certificates&lt;/P&gt;&lt;P class=""&gt;Beware: the folder is own by root&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD height="57px"&gt;Windows OneAgent&lt;/TD&gt;&lt;TD height="57px"&gt;&lt;P class=""&gt;/project/eag0/config/remotepluginmodule/agent/conf/certificates&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P class=""&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT size="6"&gt;Extension build&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;After developing your extension according the documentation&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;A href="https://dynatrace-extensions.github.io/dt-extensions-python-sdk/" target="_blank" rel="noopener"&gt;https://dynatrace-extensions.github.io/dt-extensions-python-sdk/&lt;/A&gt;&lt;/P&gt;&lt;P&gt;You need to compile&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;export&amp;nbsp;PIP_NO_INDEX=1&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;export PATH="&amp;lt;path to your new Python&amp;gt;/bin:${PATH}"&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;cd &amp;lt;path to your custom extension&amp;gt;&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&lt;EM&gt;dt-sdk build --find-links=&amp;lt;path to your local package repo&amp;gt; --private-key&amp;nbsp; &amp;lt;path to your certificate&amp;gt;/custom_extension_developer.pem&lt;/EM&gt;&lt;/P&gt;&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Gautier&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 13 Aug 2025 08:34:03 GMT</pubDate>
      <guid>https://community.dynatrace.com/t5/Custom-Solutions-Spotlight/Building-a-custom-extension-in-an-isolated-network/m-p/283714#M206</guid>
      <dc:creator>gautier_begin</dc:creator>
      <dc:date>2025-08-13T08:34:03Z</dc:date>
    </item>
  </channel>
</rss>

