os.getenv from systemd adds another backslash \\n to \n

Viewed 175

Loading the .env file in /etc/systemd/system/p-app.service:

[Service]
... 

EnvironmentFile=/u/p/app.env

How the keys are stored in /u/p/app.env:

AUTH_JWT_PRIVATE="-----BEGIN EC PRIVATE KEY-----\nM...5f/KL...49\nA...wN/VT...VE/KW...yQ\nM...mA==\n-----END EC PRIVATE KEY-----"

AUTH_JWT_PUBLIC="-----BEGIN PUBLIC KEY-----\nM...wN/VT...VE/KW...mA==\n-----END PUBLIC KEY-----"

Retrieval Python:

def get_envar(name):
    if name in os.environ:
        try:
            payload = os.getenv(name)
            print(f'Environment variable {name} loaded.')
        except Exception as error:
            sys.exit(
                'Failed importing {} from environment variable. Error: {}'.format(name, error))
        else:
            return payload
    else:
        sys.exit('Failed importing environment variable {} was not found!'.format(name))


AUTHORIZE_JWT_KEY_PRIVATE = get_envar('AUTH_JWT_PRIVATE').encode('ascii')
AUTHORIZE_JWT_KEY_PUBLIC = get_envar('AUTH_JWT_PUBLIC').encode('ascii')

And when I print these variables I get this:

b'-----BEGIN EC PRIVATE KEY-----\\nM...5f/KL...49\\nA...wN/VT...VE/KW...yQ\nM...mA==\\n-----END EC PRIVATE KEY-----'

With double backslash \\n.

And therefore I am getting an error

ValueError: Could not deserialize key data. The data may be in an incorrect format or it may be encrypted with an unsupported algorithm.

at return jwt.encode(payload=payload, key=private, algorithm=algorithm)

Am I doing something wrong?

1 Answers

Solved the issue like by storing the keys in /u/p/app.env like this:

AUTH_JWT_PRIVATE="-----BEGIN EC PRIVATE KEY-----
M...5f/KL...49
A...wN/VT...VE/KW...yQ
M...mA==
-----END EC PRIVATE KEY-----"

AUTH_JWT_PUBLIC="-----BEGIN PUBLIC KEY-----
M...wN/VT...VE/KW...mA==
-----END PUBLIC KEY-----"
Related