gregtwallace / apc-p15-tool

APC P15 Tool is an open source replacement for APC's NMC Security Wizard.
GNU General Public License v3.0
20 stars 5 forks source link

APC P15 Tool

APC P15 Tool is a completely open source application designed to make creating and installing SSL certificates on APC (Schneider Electric) Network Management Cards (2 & 3) simple and easy to do. It is also designed to simplify automation of the certificate management lifecycle.

Background

When APC created the NMC2 (Network Management Card 2), they chose to use the p15 file format for their SSL keys and certificates, which is a relatively obscure file format. In addition to this, they designed the device to require an APC specific header be prepended to the p15 file or the file would be rejected by the device. Accordingly, they created a proprietary tool (the NMC Security Wizard CLI Utility) to generate the required format.

Unfortunately, the proprietary tool has a number of shortcomings:

Due to all of this, others have tried to recreate the proprietary functionality. The only implementations I have found rely on a closed source library called cryptlib. This library has evolved over time and more recent versions do not work for the NMC (it appears at some point cryptlib switched from 3DES to AES and NMC does not support AES within the p15 file). It was also near impossible to find an old enough version of cryptlib that would work. Even if one gets this working, it does not resolve the obscurity of a closed source implementation and would continue to be subject to potential future breakage as the cryptlib library continues to evolve.

This project aims to solve all of these problems by accepting the most common key and cert file format (PEM) and by being 100% open source and licensed under the GPL-3.0 license.

Compatibility Notice

Both NMC2 and NMC3 devices should be fully supported. However, I have one NMC2 device in a home lab and have no way to guarantee success in all cases.

Key Types and Sizes

NMC2:

NMC3*:

* 3,072 bit length is not officially supported by my NMC2, but appears to work fine.

* The additional key types supported by NMC3 require newer firmware on the device. I am unsure what the version cutoff is, but you can check support by connecting to the UPS via SSH and typing ssl. If Command Not Found is returned, the firmware is too old and only the key types listed under NMC2 will work.

1,024 bit RSA is no longer considered completely secure; avoid keys of this size if possible. Most (all?) public ACME services won't accept keys of this size anyway.

General Troubleshooting

My setup (and therefore the testing setup) is:

If you have trouble, your first step should be to update your NMC's firmware. Many issues with this tool will be resolved simply by updating to the newest firmware.

If you have a problem after that, please post the log in an issue and I can try to fix it but it may be difficult without your particular hardware to test with.

In particular, if you are experiencing ssh: handshake failed: first try using the --insecurecipher flag. If this works, you should upgrade your NMC to a newer firmware which includes secure ciphers. You should NOT automate your environment using this flag as SSH over these ciphers is broken and exploitable. If this also does not work, please run ssh -vv myups.example.com and include the peer server KEXINIT proposal in your issue. For example:

debug2: peer server KEXINIT proposal
debug2: KEX algorithms: diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,ecdh-sha2-nistp256
debug2: host key algorithms: ssh-rsa
debug2: ciphers ctos: aes256-ctr,aes128-ctr,aes256-cbc,aes128-cbc
debug2: ciphers stoc: aes256-ctr,aes128-ctr,aes256-cbc,aes128-cbc
debug2: MACs ctos: hmac-sha2-256,hmac-sha1
debug2: MACs stoc: hmac-sha2-256,hmac-sha1
debug2: compression ctos: none
debug2: compression stoc: none
debug2: languages ctos:
debug2: languages stoc:

Usage

Currently the tool contains two commands: create and install. The tool can be run with the --help flag to see options.

i.e. ./apc-p15-tool --help

Help can also be run on a subcommand to see the options for that subcommand.

e.g. ./apc-p15-tool install --help

Create

Create creates an apc p15 file from given key and cert pem files or content.

e.g. ./apc-p15-tool create --keyfile ./apckey.pem --certfile ./apccert.pem

The command creates and outputs ./apctool.p15 and ./apctool.key.p15 by default. These files are equivelant to the key and final p15 files generated by APC's proprietary tool.

Install

Install generates the necessary p15 file(s) but does NOT save them to disk. It instead installs the files directly on the NMC. Logic automatically deduces if the device is an NMC2 or NMC3 and performs the appropriate installation steps.

e.g. ./apc-p15-tool install --keyfile ./apckey.pem --certfile ./apccert.pem --hostname myapc.example.com --username apc --password someSecret --fingerprint 123abc

Note About Install Automation

The application supports passing all args instead as environment variables by prefixing the flag name with APC_P15_TOOL.

e.g. APC_P15_TOOL_KEYPEM

Additionally, there is a second binary built with just the install command so the subcommand is not needed.

There are mutually exclusive flags that allow specifying the pem as either filenames or directly as strings. The strings are useful for passing the pem content from another application without having to save the pem files to disk.

Putting all of this together, you can combine the install binary with a tool like Cert Warden (https://www.certwarden.com/) to call the install binary, with environment variables, to directly upload new certificates as they're issued by Cert Warden, without having to write a separate script.

Cert Warden with APC P15 Tool

Thanks

Special thanks to the following people and resources which helped me deduce how all of this works:

https://github.com/dnlmengs/pemtrans

https://github.com/freddy36/apc_tools

http://lapo.it/asn1js/