On March 1, 2021 Nintendo released Wii U firmware version 5.5.5. This update updated the Wii U's SSL verification and recompiled all RPLs (though no code changes were made). The exact purpose for this update is unknown, as nothing of significance was changed, and no other changes were made in this update. With the changes to SSL verification, Nintendo introduced a bug which allows for the forging of SSL certificates. These forged certificates will be seen as "Nintendo Signed" and, due to an existing bug with how the Wii U handles CA common names, will be accepted by all domains.
There are 2 bugs at play:
Not any CA will work. There are 3 conditions for a CA which still need to be met even for a forged CA to be accepted:
The easiest way to exploit this bug is to use the Nintendo CA - G3 CA, and is what this script opts to do. This can be dumped from a Wii U's SSL certificates title at /storage_mlc/sys/title/0005001b/10054000/content/scerts/CACERT_NINTENDO_CA_G3.der
. Changing the public key to a user-controlled key and changing the authority key identifier to anything else is all that is required. The resulting user-controlled private key and patched CA can be used to bypass SSL verification without any homebrew or CFW at all.
This script takes in a copy of the Nintendo CA - G3 (in either DER or PEM format), does the above patches, and exports the patched CA and private key.
git clone https://github.com/PretendoNetwork/SSSL.git
cd SSSL
npm i
to install the dependenciesnode patch
to use environment variables or node patch -i
to interactively prompt for all configuration valuesThis script can also be run in a Docker container.
git clone https://github.com/PretendoNetwork/SSSL
cd SSSL
docker build . -t sssl
docker run -it --rm -v .:/app/certs sssl -g3 /app/certs/CACERT_NINTENDO_CA_G3.der -o /app/certs
This script can be configured using environment variables, a .env
file, or individual command-line arguments. Alternatively, it can be run with the -i
or --interactive
flag to interactively prompt for all configuration values. Command-line arguments always override environment variables.
Environment Variable | Command-line Argument | Description | Default |
---|---|---|---|
N/A | -i , --interactive |
Interactively prompt for all configuration values | N/A |
SSSL_NINTENDO_CA_G3_PATH | -g3 , --nintendo-ca-g3-path <value> |
Path to Nintendo CA - G3 certificate (may be in DER or PEM format) | ./CACERT_NINTENDO_CA_G3.der |
SSSL_NINTENDO_CA_G3_FORMAT | -f , --nintendo-ca-g3-format <value> |
Nintendo CA - G3 certificate format (must be "der" or "pem") | der |
SSSL_CA_PRIVATE_KEY_PATH | -cap , --ca-private-key-path <value> |
Path to private key for forged CA (will generate if not set) | N/A |
SSSL_SITE_PRIVATE_KEY_PATH | -sp , --site-private-key-path <value> |
Path to private key for site certificate (will generate if not set) | N/A |
SSSL_CSR_PATH | -csrp , --csr-path <value> |
Path to CSR (will generate if not set) | N/A |
SSSL_COMMON_NAME | -cn , --common-name <value> |
CN for site certificate (see the bugs) | * |
SSSL_OUTPUT_FOLDER_PATH | -o , --output-folder-path <value> |
Output folder | ./ |